2015-09-09 2 views
0

У меня есть данные с идентификаторами переменных и кодом. Примеры данных, приведенных ниже:NOT IN Выберите оператор, возвращающий 0 значений

ID Code 
abc 00 
def 00 
ghi 00 
def 23 
jkl 00 
mno 20 
pqr 24 

ID может иметь несколько значений разных кодов. Я пытаюсь отработать все возможные комбинации кода на ID (есть 15 в общей сложности)

Мой код:

select id, code from data.test 
where id in (select id from data.test where code = 00) 
and id in ('abc','def','ghi','jkl','mno','pqr') 

работает отлично (возвращение 4 строки), однако этот код:

select id, code from data.test 
where id not in (select id from data.test where code = 23) 
and id in ('abc','def','ghi','jkl','mno','pqr') 

возвращает 0 строк? Он должен возвращать 3 строки.

Я использую Teradata SQL Assistant версии 15.00.0.02.

Любая помощь будет оценена по достоинству.

+2

Она должна возвращать 5 строк - все, кроме '23' четкости. Это явно не ваш настоящий код; Я думаю, что что-то потеряно в упрощении. – Blorgbeard

ответ

2

Одна из причин, почему not in с подзапросом не работает, заключается в том, что одно из значений (id в вашем случае) - NULL. В этом случае выражение NOT IN никогда не возвращает true. Один из способов это исправить:

select id, code 
from data.test 
where id not in (select id from data.test where code = 23 and id is not null) and 
     id in ('abc', 'def', 'ghi', 'jkl', 'mno', 'pqr') 

Другой способ заключается в использовании NOT EXISTS:

select t.id, t.code 
from data.test t 
where not exists (select 1 from data.test t2 where t.code = 23 and t2.id = t.id) and 
     t.id in ('abc', 'def', 'ghi', 'jkl', 'mno', 'pqr') 
+0

Спасибо кучи Gordon – Shaz

+2

В Teradata следует предпочесть 'НЕ СУЩЕСТВУЕТ'' над' NOT IN' – dnoeth

+1

@dnoeth. , , Обычно я предпочитаю «НЕ СУЩЕСТВУЕТ» именно из-за семантической разницы (и, к счастью, он часто работает лучше, чем «НЕ IN»). –