Результаты SQL 0 для «Не в» и «В», когда строка существует - PullRequest
0 голосов
/ 02 мая 2018

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

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

Ответы [ 3 ]

0 голосов
/ 02 мая 2018

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

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

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

0 голосов
/ 03 мая 2018

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

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

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

0 голосов
/ 02 мая 2018

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

select * 
from table(A) a
where not exists (selet 1 from tableB where orderno = a.orderno);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...