根据两列的组合查找不同的行

时间:2014-11-03 14:55:44

标签: sql sql-server sql-server-2008 tsql

我无法在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相同。

我的问题的预期结果将是:

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

我正在使用SQL Server 2008。

2 个答案:

答案 0 :(得分:2)

如果我理解正确,这将是一个简单的" distinct"查询是否总是让ColA的值小于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

答案 1 :(得分: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