2015-06-24 74 views
1

我有這個以下的數據結構,我試圖找到唯一的ID,其中值字母值等於到A和B(即選擇ID = 1,但不是ID = 3或5 )。 並且還找到唯一的ID,其中值字母值包含 A和B(即選擇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'); 

回答

2

這應該這樣做:

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 
+0

感謝,即完美。 我打算使用更有效的HAVING解決方案而不是EXCEPT加入。 – Deb

+0

嘿@spaghettidba,另一個查詢.....如果我想選擇ID = 1,3和5?其是具有兩個** ** A和B – Deb

+1

@Deb'SELECT ID FROM字母 WHERE字母IN( 'A', 'B') GROUP BY ID HAVING COUNT(*)= 2' – spaghettidba