Удаление строк в объединенных таблицах с помощью ADO
Вопрос
Теперь я видел этот вопрос в еще один форум но на это не было приемлемого ответа.
Предположим, у меня есть две таблицы: таблица групп и таблица элементов.Таблицы не имеют определенных связей.Таблица Elements содержит поле IdGroup, которое ссылается на поле IdGroup (PK) таблицы Groups.
Я использую следующий запрос через набор записей ADO для заполнения значений таблиц в datagrid:
SELECT Elements.*, Groups.GroupName
FROM Elements
INNER JOIN Groups ON Elements.IdGroup = Groups.IdGroup
Из этой сетки я хочу нажать Delete, чтобы удалить элемент.Вот в чем моя проблема.Когда я использовал DAO, функция DAO Delete() удалила только запись в группе Элементов.Это было ожидаемое поведение.
Когда я перешел на ADO, функция Delete() удалила записи в обеих таблицах, запись элемента и группу, к которой принадлежал элемент!
Есть ли какой-нибудь способ воспроизвести поведение DAO в ADO без необходимости определять связи в таблицах?
Примечание:Я знаю, что есть альтернативы (выполнение запросов на УДАЛЕНИЕ могло бы выполнить эту работу).Просто покажите мне способ сделать это в ADO или скажите, что это невозможно.
Решение
Перепишите ваш запрос на:
- замените ВНУТРЕННЕЕ СОЕДИНЕНИЕ предложением WHERE, состоящим из EXISTS;
- используйте подзапрос в предложении SELECT, чтобы вернуть значение Groups.Имя_группы.
Пример:
SELECT Elements.*,
(
SELECT Groups.GroupName
FROM Groups
WHERE Elements.IdGroup = Groups.IdGroup
)
FROM Elements
WHERE EXISTS (
SELECT *
FROM Groups
WHERE Elements.IdGroup = Groups.IdGroup
);
Я протестировал это с помощью SQL Server 2008 с набором записей ADO, установленным в качестве свойства DataSource элемента управления Microsoft OLEDB Datagrid (MSDATGRD.OCX) затем удаляем строку через gird (я предполагаю, что вы делаете что-то подобное), и строка действительно удаляется только из элементов таблицы (т.Е.строка в Группах остается не удаленной).
Обратите внимание, что пересмотренный запрос может оказать негативное влияние на производительность при выборке строк.