一尘不染

如果1行满足条件,则排除ID的所有行

sql

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

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的行,即使存在与Guardian =
Y的ClientId相关联的任何行,该ClientId也不应出现在结果中。我一直在寻找如何仅选择其中具有某些值的行,但是我没有运气找到如何完全排除ClientId(如果其中一行匹配)。

如果有任何建议,我将不胜感激!


阅读 119

收藏
2021-05-30

共1个答案

一尘不染

子查询获取ClientId没有任何的Guardian = 'Y'。如果您需要完整的记录,也可以使用外部查询。如果仅需要ID,则仅使用子查询

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
)
2021-05-30