Удаление строк в объединенных таблицах с помощью ADO

StackOverflow https://stackoverflow.com/questions/95041

  •  01-07-2019
  •  | 
  •  

Вопрос

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top