2016-03-31 2 views
0

У меня есть две таблицы A и B, в B есть внешний ключ от A, что я хочу сделать, это удалить все строки из A, которые они наняли У меня есть случай в B, я выполняю следующий запрос, но он не работает:Удалить строки из таблицы с не в (другая таблица)

DELETE from A 
WHERE id_A 
     not in (select DISTINCT(foreign_key_of_A_in_B) from B) 

Любая идея?

+1

Попробуйте 'выбрать * из А где id_A не в (выберите ...'. Вы получаете какие-либо строки? – jarlh

+2

Покажите нам определение таблицы. (Я хочу знать определение Fk.) – jarlh

+1

Пожалуйста, ответьте Jarlh вопросов закажите для нас, чтобы помочь вам. – sagi

ответ

3

Моя первая рекомендация попробовать not exists, а не not in:

DELETE a FROM a 
WHERE NOT EXISTS (SELECT 1 FROM b WHERE b.foreign_key_of_A_in_B = a.id_A); 

NOT IN возвращает ложное или NULL если любое значение в подзапрос NULL. Так определяется оператор. NOT EXISTS имеет более ожидаемое поведение. Итак, если в подзапросе есть значения NULL, это будет работать (т. Е. Удалять строки), но версия NOT IN не будет.

Я рекомендую вам попробовать логика, используя SELECT перед выполнением DELETE:

SELECT A.* 
FROM A 
WHERE NOT EXISTS (SELECT 1 FROM b WHERE b.foreign_key_of_A_in_B = A.id_A); 
+0

Большое спасибо за решение и объяснение Гордона (не знал этого поведения с нулевыми значениями, о которых раньше не было), он работает как шарм! –

0

Стандарт для DELETE FROM таблицы WHERE ID NOT IN будет выглядеть следующим образом:

DELETE from Table_A 
WHERE id -- ID of Table_A 
     not in (select ID FROM Table_B) 

Этот должны найти идентификаторы, не указанные в таблице A из таблицы B, поскольку в вашем заявлении указан

Попробуйте сначала в инструкции SELECT, чтобы проверить, поворачивает правильные строки:

SELECT * from Table_A 
WHERE id -- ID of Table_A 
     not in (select ID FROM Table_B) 

Не забудьте перекрестно ссылаться на некоторые строки, чтобы дважды проверить.

+0

Это то, что я сделал, но в этом случае использование не существует, как объяснил Гордон, это лучший способ. –

Смежные вопросы