2017-01-03 2 views
2

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

ClientId | ContactId | Guardian 
123  | 1   | Y 
123  | 2   | N 
123  | 3   | N 

456  | 4   | N 
456  | 5   | N 
456  | 6   | N 

Желаемый результат:

ClientId | ContactId | Guardian 
456  | 4   | N 
456  | 5   | N 
456  | 6   | N 

Так что моя цель состоит в том, что клиент 456 будет отображаться в моих результатах запроса, но не Клиент 123. Я написал следующее:

select * from Contacts 
where Guardian <> (case when Guardian = 'Y' 
    then Guardian 
     else '' 
     end) 

Я также пробовал

select * from Contacts c 
where not exists (select 1 
        from Contacts c2 
        where c2.ContactId = c.ContactId 
        and c.Guardian = 'Y')      

Но мои результаты просто исключают строки, где Guardian = Y, и печатают строки, где Guardian = N, хотя, если есть какая-либо строка, связанная с ClientId, где Guardian = Y, что ClientId не должен отображаться в результатах , Я искал, как выбирать строки с определенными значениями в них, но мне не удаётся найти, как полностью исключить ClientId, если соответствует одна из его строк.

Я был бы очень благодарен за любые предложения!

+0

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

+0

@PM 77-1 Требуемый выход будет ClientId | Контакт | Опекун 456 | 4 | N 456 | 5 | N 456 | 6 | N – jfe042

+0

Пожалуйста, добавьте эту информацию к вашему вопросу (с помощью [Изменить]). –

ответ

0

Подзапрос получает ClientId с, который не имеет Guardian = 'Y'. Если вам нужна полная запись, используйте внешний запрос. Если вам нужно только идентификатор затем использовать только подзапрос

select * 
from Contacts 
where ClientId in 
(
    select ClientId 
    from Contacts 
    group by ClientId 
    having sum(case when Guardian = 'Y' then 1 else 0 end) = 0 
)     
+0

что сделал! Спасибо! – jfe042

2

Причина, я считаю, что вы испытываете это потому, что вы подключали подзапрос с помощью contactid вместо clientid. Я также включил в отличие выхода:

select distinct c.ClientId 
from Contacts c 
where not exists (select 1 
        from Contacts c2 
        where c2.ClientId = c.ClientId 
        and c2.Guardian = 'Y') 
0
select * 
from contacts 
where ClientId not in 
(
    select ClientId 
    from contacts 
    where Guardian = 'Y' 
)