各「ペア」の要素の順序を維持することが重要でない場合は、eggyal からの回答を参照してください。そのクエリは、指定したものとはわずかに異なる結果セットを返します。102-987
の代わりにペアを返します987-102
。また、テーブルに表示される「重複」ペアを排除します。
各ペアの要素の順序を維持することが重要であり、これらの「一致する」ペアの両方が存在するときに「大きい - 小さい」ではなく「小さい - 大きい」を返したい場合は、次のようなものを使用できます。
SELECT c.col1, c.col2
FROM mytable c
LEFT
JOIN mytable d ON d.col1 = c.col2 AND d.col2 = c.col1 AND d.col1 <> d.col2
WHERE (d.col1 IS NULL OR d.col1 > c.col1)
すべての重複ペアと「一致する」ペアを削除するには、GROUP BY 句または DISTINCT キーワードを追加します。
SELECT c.col1, c.col2
FROM mytable c
LEFT
JOIN mytable d ON d.col1 = c.col2 AND d.col2 = c.col1 AND d.col1 <> d.col2
WHERE (d.col1 IS NULL OR d.col1 > c.col1)
GROUP BY c.col1, c.col2
ノート:
SQL フィドル: http://sqlfiddle.com/#!2/1d9e7/1およびここ: http://sqlfiddle.com/#!2/1d9e7/2
比較演算子は null セーフではありません。col1 または col2 に NULL 値が含まれている場合、必要な結果セットが返されない場合があります。(クエリは、col1 および/または col2 の NULL 値を処理するように変更できます。) 記述されているように、両方のクエリは、たとえば、「一致する」「ペア」がテーブルにある場合と両方(1,NULL)
を返します。(NULL,1)
(要するに、NULL 値が一致すると見なすかどうかという問題になります。)
また、両方のクエリが行を返すことに注意してくださいcol1=col2
。
最初のクエリは、テーブルに存在する「重複」行を排除しないことに注意してください。つまり、重複した「ペア」(202,101)
が 2 つの異なる行にある場合など、両方が返されます (クエリが「一致する」ペアを持つ行を少なくとも 1 つ返さない限り: (101,202)
.)
これらの場合に返される結果セットが明確ではなかったため、最初のクエリは(larger,smaller)
、一致する(smaller,larger)
ペアが結果セットにある場合にのみ行を削除するパターンを示しています。
2 番目のクエリは、すべての重複と「一致する」ペアを排除します。