2013-03-15 68 views
0

我不知道如何解釋這種情況,這有點棘手,所以我會嘗試給你一個我擁有的數據和輸出I的示例需要:選擇列B只有列A不同實例的所有記錄

CREATE TABLE #TempTable(A int, B int) 
INSERT INTO #TempTable (A,B) 
VALUES 
(1,1), 
(1,2), 
(1,2), 
(1,4), 
(3,2), 
(3,2), 
(3,2), 
(3,3), 
(3,3); 

我無法弄清楚如何選擇的所有記錄,使得最終的輸出是:

1,1 
1,4 
3,3 
3,3 

我需要在那裏列B只有A列的不同實例記錄所有其他實例應該被忽略... 我覺得這應該是漂亮的很簡單,但我正在消隱,我無法弄清楚。

更新:

我一直有一個很難解釋這一點,但我認爲這是正確的邏輯:你可以有B的重複的實例對於給定的A,但你不能有B跨越不同A的重複實例。

+4

我必須錯過某些東西爲什麼在您的列表中給出了您定義的規則中的3,3 ... – xQbert 2013-03-15 19:24:47

+1

您使用哪種數據庫系統? – MarcinJuraszek 2013-03-15 19:26:46

+0

@xQbert對於給定的A,您可以有B的重複實例,但不能在不同的A之間有B的重複實例。 – Kiril 2013-03-15 19:30:57

回答

2
SELECT A, B FROM TempTable 
WHERE B IN (
    SELECT B 
    FROM TempTable 
    GROUP BY B 
    HAVING COUNT(DISTINCT A) = 1 
) 

工作在MS SQL 2012例如:http://sqlfiddle.com/#!6/d235a/4

+0

缺少3,3;我認爲我的需求需要修改:對於給定的A,可以有重複的B實例,但不能在不同的A之間有重複的B實例。 – Kiril 2013-03-15 19:33:09

+0

我一直在努力實際地描述這個需求,因爲它有點模糊,但我想我已經縮小了它的範圍。 – Kiril 2013-03-15 19:35:08

+0

更新了我的回答。 – MarcinJuraszek 2013-03-15 19:35:24

2

嘗試:

with cte as 
(select t.*, min(A) over (partition by B) minA, max(A) over (partition by B) maxA 
from #TempTable t) 
select A, B 
from cte 
where minA=maxA 
相關問題