SQL排除

时间:2019-05-11 22:16:34

标签: sql oracle

我有一个表,其中包含ID号和NAMES的简单列表-我正在尝试编写一个SQL,该SQL仅返回NAME没有特定ID的行。

这让我很困惑-以下查询返回所有内容,因为它们具有排除列表中的其他ID(较大的ID范围)。如何构造查询,以仅返回那些没有ID 2或3的查询-即,仅返回下表的“ bob”。

从表中选择*,其中ID不在(2,3)中

ID  NAMES
1   bob
1   alice
2   alice
1   dave
2   dave
3   dave
4   dave

谢谢。

1 个答案:

答案 0 :(得分:4)

一种方法是group byhaving

select name
from t
group by name
having sum(case when ID in (2, 3) then 1 else 0 end) = 0;

如果要使用原始ID,可以将listagg(id, ',') within group (order by id)添加到select。或使用not exists

select t.*
from t
where not exists (select 1
                  from t t2
                  where t2.name = t.name and
                        t2.id in (2, 3)
                 );