2014-11-03 39 views
0

我無法找到SQL中問題的良好解決方案。根據兩列的組合找到不同的行

說我有表是這樣的:

ID | A | A 
-------------------- 
4427 | 2 | 3 
4427 | 3 | 2 
4427 | 3 | 5 
4427 | 5 | 3 
4427 | 1 | 3 
4427 | 2 | 5 
4427 | 3 | 1 

現在我想找到ID和A的獨特組合我的意思,我只是想看看行的行通過這個地方的組合A(1)和A(2)只存在一次。例如,在表中的前兩行是「相同」的,因爲2和3的結合是相同的3和2

預期的結果到我quesion將是:

ID | A | A 
-------------------- 
4427 | 2 | 3 
4427 | 3 | 5 
4427 | 1 | 3 
4427 | 2 | 5 

我我正在使用SQL Server 2008.

+1

爲什麼選擇(2,3)而不是(3,2)? – 2014-11-03 15:04:44

+0

@JoeTaras - >如果是(2,3)或(3,2),對我沒有影響。 – ssn 2014-11-03 15:22:15

回答

2

如果我理解正確的,這將是一個簡單的「獨特」的查詢,如果你總是把可樂小於COLB的值。鑑於此,您可以使用case語句來處理此問題,並結合使用不同的運算符。

試試這個。

Select Distinct 
     ID, 
     Case When ColA < ColB Then ColA Else ColB End, 
     Case When ColA < ColB Then ColB Else ColA End 
From YourTableHere 
+0

該表是一個自聯接,所以組合將始終存在於兩列中。這像一個魅力。 – ssn 2014-11-03 15:47:29

+0

我不知道任何關於你的過程(總體目標),但它可能修改自我連接代碼看起來像這樣...表作爲X連接表作爲Y在X.Id = Y.Id和X .ColA 2014-11-03 16:06:59

+0

是的,這工作完美 - 實際上是一個更簡單的解決方案,謝謝。這主要是一次性的事情,但是如果我必須手動完成,我的行數太多。 – ssn 2014-11-03 16:45:47

0

這樣做的一種方法。僅供參考,產量A1/A2可能與原始價格不同。如果你不關心訂單,你可以試試。

WITH cte AS (
    SELECT ID,A1 AS A, ROW_NUMBER() OVER (ORDER BY A1,A2) AS rn FROM Table1 
UNION ALL 
    SELECT ID,A2 AS A, ROW_NUMBER() OVER (ORDER BY A1,A2) AS rn FROM Table1 
) 
SELECT DISTINCT ID, MIN(A) AS A1, MAX(A) AS A2 
FROM cte 
GROUP BY ID, rn 

SQL Fiddle

相關問題