在 SQL 中,筛选其他列中只有一个值的 ID

In SQL, filter IDs with only one value in other column

提问人:FrancoisDuCoq 提问时间:10/26/2023 最后编辑:marc_sFrancoisDuCoq 更新时间:10/27/2023 访问量:54

问:

假设我们有一个表,在 SQL Server 表中包含 2 列:MyTable

编号
1 一个
1 b
1 s
1 w
2 s
2 s
3 w
.. ..

如何找到所有在排名列中只有值,而没有其他排名的ID?'s'

我希望结果是

编号
2 s
sql-server sql-server-2008

评论

1赞 jarlh 10/26/2023
示例数据很棒,但您还需要指定预期结果。此外,您的表包含,而不是字段。
0赞 jarlh 10/26/2023
HAVING count(distinct rank) = 1,如果您希望 ID 只有一个不同的排名值,则 S 或其他。 查找只有 S 等级的 ID。HAVING count(case when rank <> 's' then 1 end) = 0
2赞 Jonas Metzler 10/27/2023
@FrancoisDuCoq 如果您在提出下一个问题时展示您尝试过的内容,那就太好了
0赞 marc_s 10/27/2023
顺便说一句:SQL Server 2008 和 2008 R2 现在完全不受支持(甚至不支持扩展支持),而且已经支持了好几年。red-gate.com/simple-talk/sql/database-administration/......- 是时候升级了!

答:

3赞 SelVazi 10/26/2023 #1

我们可以使用 和 子句:group byhaving

每个 ID 的总数应与所有行的总计数匹配。rank='s'

SELECT ID --, 's' as rank
FROM mytable
GROUP BY ID
HAVING count(CASE WHEN rank = 's' THEN 1 END) = COUNT(*)

在这里演示

评论

1赞 Charlieface 10/26/2023
或者如评论中提到的HAVING count(case when rank <> 's' then 1 end) = 0
1赞 SelVazi 10/27/2023
仅当列排名不包含 null 值时,它才有效 dbfiddle.uk/J6h5CAYv
1赞 Charlieface 10/27/2023
然后可以使用 dbfiddle.uk/ORJZS60aIS DISTINCT FROMOR rank IS NULL
0赞 Slava Rozhnev 12/7/2023 #2

只有一个解决方案使用 NOT EXISTS 条件

select distinct * from mytable
where not exists (
    select 1 from mytable mytable_copy where rank <> 's' and mytable_copy.ID = mytable.ID
);