混合列に基づいて重複する行を見つけようとしています。これは私が持っているものの例です:
CREATE TABLE Test
(
id INT PRIMARY KEY,
test1 varchar(124),
test2 varchar(124)
)
INSERT INTO TEST ( id, test1, test2 ) VALUES ( 1, 'A', 'B' )
INSERT INTO TEST ( id, test1, test2 ) VALUES ( 2, 'B', 'C' )
このクエリを実行すると、次のようになります。
SELECT [LEFT].[ID]
FROM [TEST] AS [LEFT]
INNER JOIN [TEST] AS [RIGHT]
ON [LEFT].[ID] != [RIGHT].[ID]
WHERE [LEFT].[TEST1] = [RIGHT].[TEST2]
私は両方のIDを取り戻すことを期待しています。(1と2)しかし、私は1行しか取り戻せません。
私の考えでは、各行を比較する必要がありますが、これは正しくないと思いますか?これを修正するために、クエリを次のように変更しました。
SELECT [LEFT].[ID]
FROM [TEST] AS [LEFT]
INNER JOIN [TEST] AS [RIGHT]
ON [LEFT].[ID] != [RIGHT].[ID]
WHERE [LEFT].[TEST1] = [RIGHT].[TEST2]
OR [LEFT].[TEST2] = [RIGHT].[TEST1]
これで両方の行が得られますが、行数に基づいてパフォーマンスが非常に急速に低下します。
パフォーマンスと結果について私が思いついた最後の解決策は、ユニオンを使用することでした。
SELECT [LEFT].[ID]
FROM [TEST] AS [LEFT]
INNER JOIN [TEST] AS [RIGHT]
ON [LEFT].[ID] != [RIGHT].[ID]
WHERE [LEFT].[TEST1] = [RIGHT].[TEST2]
UNION
SELECT [LEFT].[ID]
FROM [TEST] AS [LEFT]
INNER JOIN [TEST] AS [RIGHT]
ON [LEFT].[ID] != [RIGHT].[ID]
WHERE [LEFT].[TEST2] = [RIGHT].[TEST1]
しかし、全体として、これが機能しない理由の理解が明らかに欠けています。これは、おそらく何か間違ったことをしていることを意味します。誰かが私を正しい方向に向けることができますか?