计算唯一记录所需的查询帮助

Count query help needed with unique records

我有以下数据结构,我试图找到唯一 ID,其中值 Alphabets 值 等于 到 A 和 B(即 select ID = 1,但不是 ID = 3 或 5)。 并找到唯一 ID,其中值 Alphabets 值包含 Both A 和 B(即 select ID = 1、3 和 5)。

╔═══╦════════════╦═════════════╗
║   ║ ID         ║ Alphabets   ║
╠═══╬════════════╬═════════════╣
║ 1 ║ 1          ║ A           ║
║ 1 ║ 1          ║ B           ║
║ 4 ║ 2          ║ B           ║
║ 5 ║ 2          ║ D           ║
║ 6 ║ 3          ║ A           ║
║ 7 ║ 3          ║ B           ║
║ 8 ║ 3          ║ D           ║
║ 9 ║ 4          ║ A           ║
║ 10║ 4          ║ C           ║
║ 11║ 5          ║ A           ║
║ 12║ 5          ║ B           ║
║ 13║ 5          ║ C           ║
║ 14║ 5          ║ D           ║
╚═══╩════════════╩═════════════╝

CREATE TABLE dbo.Alphabets(
ID int NOT NULL
,Alphabets char(1) NOT NULL
,CONSTRAINT PK_Alphabets PRIMARY KEY (ID, Alphabets)
);


INSERT INTO dbo.Alphabets VALUES
 (1, 'A')
,(1, 'B')
,(2, 'B')
,(2, 'D')
,(3, 'A')
,(3, 'B')
,(3, 'D')
,(4, 'A')
,(4, 'C')
,(5, 'A')
,(5, 'B')
,(5, 'C')
,(5, 'D');

应该这样做:

SELECT ID
FROM Alphabets
WHERE Alphabets IN ('A','B')

EXCEPT

SELECT ID
FROM Alphabets
WHERE Alphabets NOT IN ('A','B')

还有许多其他方法可以完成任务,但这是最简单的方法之一。

一个更晦涩(但更有效)的单次解决方案使用聚合和 CASE 表达式:

SELECT ID
FROM Alphabets
GROUP BY ID
HAVING MAX(CASE WHEN Alphabets IN ('A','B') THEN 0 ELSE 1 END) = 0