如果1行符合条件,则排除ID的所有行

时间:2017-01-03 20:34:18

标签: sql sql-server tsql select

如果他们没有列出监护人,我会尝试从联系人表中选择某些客户。

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的运气。

我真的很感激任何建议!

3 个答案:

答案 0 :(得分: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')  

答案 1 :(得分:0)

子查询获得没有任何ClientId的{​​{1}}。如果您需要完整记录,也可以使用外部查询。如果您只需要ID,则只使用子查询

Guardian = 'Y'

答案 2 :(得分:0)

select * 
from contacts 
where ClientId not in 
(
    select ClientId 
    from contacts 
    where Guardian = 'Y'
)