上記の解決策のいずれも、問題に対する正しい答えを提供していないことに注意してください。
ここでは、使用できる 2 つの可能な答えを示します。
最初に「ベース テーブル」を生成します (注: いくつかのテスト ケースを追加しました)。
Declare @Test table (Column1 varchar(10), Column2 varchar(10))
Insert into @Test
VALUES ('A','B'),('A','B'),('A','C'),('C','B'),('B','A'),('D', 'A'), ('d','e'), ('a', 'b'), ('C','A')
select * from @Test
これにより、次の結果が得られます。
Column1 Column2
A B
A B
A C
C B
B A
D A
d e
a b
C A
クエリについては次のとおりです。
クエリ オプション 1:
;WITH numb as ( Select *, Num = ROW_NUMBER() Over(Order by Column1,Column2) from @Test)
, Num2 as ( Select T.*, n.Num from @Test t
Inner Join numb n on (t.Column1 = n.Column1 and t.Column2 = n.Column2) or (t.Column1 = n.Column2 and t.Column2 = n.Column1))
,rankk as ( select *, rnk = rank() Over(partition by num order by Column1) from Num2)
select DISTINCT Column1, Column2 from rankk where rnk = 1
結果 オプション 1:
Column1 Column2
a b
A C
C B
D A
d e
クエリ オプション 2:
;WITH source AS ( SELECT Column1, Column2,
Test = (CASE WHEN Column1 < Column2 THEN Column1 ELSE Column2 END
+ CASE WHEN Column1 > Column2 THEN Column1 ELSE Column2 END)
FROM (
SELECT Distinct Column1, Column2
FROM @Test AS bd
) AS sub1
)
SELECT Column1 = MIN(s.Column1), Column2 = MAX(s.Column2)
FROM source AS s
GROUP BY s.Test;
結果 オプション 2:
Column1 Column2
A B
A C
D A
C B
d e
注: 2 つのクエリの結果は若干異なりますが、どちらのクエリも同じ正しい結果セットを返します。