«не существует» не отображает результаты?

#tsql

#tsql

Вопрос:

 SELECT a.samAccountName
FROM   activeIds AS a
WHERE  NOT EXISTS (SELECT *
                   FROM   #tmp1 AS b
                   WHERE  a.samAccountName = b.userID)
       AND a.samAccountName LIKE 'ysp%'
ORDER  BY a.samAccountName ASC;  
GO
  

Я создал временную таблицу, которая заполняет идентификаторы пользователей от YSP0000 до YSP9999.
У меня есть существующая таблица (activeIds), которая уже заполнена идентификаторами YSP.

Я пытаюсь вывести идентификаторы YSP, которые УЖЕ НЕ существуют в существующей таблице (activeIds).

По какой-то причине идентификаторы YSP не отображаются, а вместо них отображаются другие идентификаторы (например, ZSP).

Есть ли способ заставить идентификаторы отображаться?

Комментарии:

1. Не понимаю, как zsp это может появиться здесь. Вы WHERE ... LIKE 'ysp%' должны это предотвратить. Пожалуйста, предоставьте некоторые примеры данных, которые воспроизводят проблему.

2. Я просто решил переключить таблицу в коде (например, switch #tmp1 и sAMAccountName во всех местах, то же самое со столбцами), и в нем отображаются все неиспользуемые идентификаторы. Спасибо за помощь!

Ответ №1:

Я считаю, что то, что вы ищете, не NOT EXISTS так, но NOT IN . Что-то вроде этого:

 select samAccountName
from activeIds
where samAccountId not in
(
    select badAccountIds
    from #temp1
)
  

Это позволит выбрать все имена учетных записей, идентификаторы которых отсутствуют во временной таблице.

Ответ №2:

Вы можете выполнить то же самое с помощью a left outer join .

 select a.samAccountName
from activeIds a
   left outer join #tmp1 b on a.samAccountName = b.userID 
where b.userID is null  -- don't exist in #tmp1
      and a.samAccountName like 'ysp%'
order by a.samAccountName