Результаты 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
Это должно позволить вам получить записи, а затем вы можете удалить то же самое.