Результаты SQL 0 для "Не в" и "В", когда строка существует

У меня есть таблица (A) со списком номеров заказов. Содержит одну строку.

Как только этот заказ был обработан, он должен быть удален. Тем не менее, он не может быть удален.

Я начал исследовать, действительно простой запрос выполняется для удаления.

delete from table(A) where orderno not in (select distinct orderno from tableB)

Номер заказа абсолютно не существует в таблице B.

Я изменил запрос в SSMS:

select * from table(A) where orderno not in (select distinct orderno from tableB)

Это вернуло 0 строк. Принимая во внимание, порядок не существует в таблице. Затем я изменил запрос с "не в" на "В". Это все еще возвратило 0 рядов. Как это может быть возможно, что значение не находится в списке значений, но также не отображается для противоположного?

Вещи, которые я пробовал:

  • Два дополнительных разработчика, чтобы просмотреть это.
  • ltrim (rtrim ()) для обоих выбранных значений.
  • Различные символы бросают и приводят число как int.

Кто-нибудь испытывал это?

3 ответа

Решение

Не использовать NOT IN с подзапросом. использование NOT EXISTS вместо:

delete from tableA 
    where not exists (select 1 from tableB where tableA.orderno = tableB.orderno);

В чем разница? Если есть orderno в TableB является NULL, затем NOT IN возвращается NULL, Это правильное поведение, основанное на том, как NULL определяется в SQL, но это нелогично. NOT EXISTS делает то, что вы хотите.

Ты можешь использовать not exists

select * 
from table(A) a
where not exists (selet 1 from tableB where orderno = a.orderno);

Я испытал то же самое. попробуйте соединить две таблицы tableA и TableB

select * from TableA a  
inner join TableB b on a.orderno =b.orderno

Это должно позволить вам получить записи, а затем вы можете удалить то же самое.

Другие вопросы по тегам