2015-09-24 2 views
1

Я пытаюсь ограничить свои строки на основе значений столбцов, но с трудностями получить синтаксис правильно.Oracle SQL: отдельный список строк на основе результатов, не имеющих значения столбца

Дано:

create table acctprefs (acctid char(5), 
         prefcode char(3)); 

insert into acctprefs values ('10000', 'ABC'); 
insert into acctprefs values ('10000', 'DEF'); 
insert into acctprefs values ('10000', 'GHI'); 

insert into acctprefs values ('10001', 'ABC'); 
insert into acctprefs values ('10001', 'DEF'); 
insert into acctprefs values ('10001', 'GHI'); 
insert into acctprefs values ('10001', 'ZZZ'); 

Я хотел бы вернуть четкий список счетов, которые не имеют «ZZZ» предпочтение. В этом случае, я стараюсь, чтобы получить результат, который был бы просто:

Я смог получить отдельные учетные записи с «ZZZ» с ниже запроса, но мне просто нужно обратное ,

select * 
from 
    acctprefs ap 
where 
    ap.prefcode in 
    (select ap.prefcode from acctprefs ap group by ap.prefcode having(ap.prefcode = 'ZZZ')); 
+0

Пробовали ли вы добавлять 'NOT IN' вместо 'IN' рядом с 'ap.prefcode'? Извините, если это звучит действительно глупо. – mfredy

+0

Спасибо mfredy. Я сделал, но это заканчивается тем, что дает мне все строки, у которых нет префикса ZZZ, в данном случае 6 строк. – Aaron

+0

Вы попробовали выбрать 'SELECT DISTINCT' и добавить' HAVING', чтобы исключить 'zzz'? Глупый вопрос снова @Aaron – mfredy

ответ

1

Один подход заключается в агрегации с пунктом having:

select ap.acctid 
from acctprefs ap 
group by ap.acctid 
having sum(case when ap.prefcode = 'ZZZ' then 1 else 0 end) = 0; 

Предложение having подсчитывает количество ZZZ для каждой учетной записи. , , и возвращает только те, у которых есть нуль.

+0

Спасибо @ Gordon Linoff. Как вы его написали, это возвращает нежелательный результат «10001». Однако, если конец выражения равен 0; вместо> 0; Кажется, возвращает желаемый результат. – Aaron

1

Один способ это minus.

select acctid 
from acctprefs 
where arefcode <> 'ZZZ' 
minus 
select acctid 
from acctprefs 
where arefcode = 'ZZZ' 
+0

Это работает, спасибо. – Aaron

1

Чтобы получить все, что не имеет этого значения, выберите все, что у него есть, и минус.

Select distinct acctid 
from acctprefs 
where acctid NOT IN (select acctid 
         from acctprefs 
         where prefcode = 'ZZZ') 

Успехов

+0

Это тоже работает, спасибо. – Aaron

Смежные вопросы