Удаление строк в соединенных таблицах с помощью ADO - PullRequest
1 голос
/ 18 сентября 2008

Теперь я видел этот вопрос в другом форуме , но на него не было приемлемого ответа.

Предположим, у меня есть две таблицы: таблица групп и таблица элементов. Таблицы не имеют определенных отношений. В таблице «Элементы» есть поле IdGroup, которое ссылается на поле IdGroup (PK) таблицы «Группы».

Я использую следующий запрос через набор записей ADO для заполнения значений таблиц в сетке данных:

SELECT Elements.*, Groups.GroupName
FROM Elements
INNER JOIN Groups ON Elements.IdGroup = Groups.IdGroup

Из этой сетки я хочу нажать Удалить, чтобы удалить Элемент. Здесь моя проблема. Когда я использовал DAO, функция DAO Delete () удаляла только запись в группе Элементы. Это было ожидаемое поведение.

Когда я перешел на ADO, функция Delete () удаляла записи в обеих таблицах, записи элемента и группы, к которой принадлежал элемент!

Есть ли способ воспроизвести поведение DAO в ADO без необходимости определения отношений в таблицах?

Примечание: я знаю, что есть альтернативы (выполнение запросов DELETE может помочь). Просто покажи мне способ сделать это в ADO или скажи, что это невозможно.

1 Ответ

1 голос
/ 08 января 2009

Перепишите запрос на:

  • заменить INNER JOIN предложением WHERE, состоящим из EXISTS;
  • используйте подзапрос в предложении SELECT для возврата значения Groups.GroupName.

Пример:

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 (я полагаю, вы делаете что-то подобное) и строка действительно удаляется только из элементов таблицы (т.е. строка в группах остается неосуществленной).

Обратите внимание, что пересмотренный запрос может отрицательно повлиять на производительность при извлечении строк.

...