2014-11-03 40 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

相关问题