La comparaison de la Table SQL à lui-même (Auto-jointure)

J'essaie de trouver les doublons de lignes basé sur des colonnes. Ceci est un exemple de ce que j'ai:

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' )

Maintenant, si je lance cette requête:

SELECT [LEFT].[ID] 
FROM [TEST] AS [LEFT] 
   INNER JOIN [TEST] AS [RIGHT] 
   ON [LEFT].[ID] != [RIGHT].[ID] 
WHERE [LEFT].[TEST1] = [RIGHT].[TEST2]

Je m'attends à dos les deux id. (1 et 2), cependant je ne jamais revenir le une ligne.

Mes pensées serait qu'il doit comparer chaque ligne, mais je suppose que ce n'est pas correct?
Pour corriger cela, j'avais changé ma requête:

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]

Qui me donne à la fois les lignes, mais les performances se dégradent très rapidement sur la base du nombre de lignes.

La solution finale, je suis venu pour les performances et les résultats a été d'utiliser une union:

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]

Mais dans l'ensemble, je suis évidemment manquant de comprendre pourquoi ceci ne fonctionne pas, ce qui signifie que je suis probablement fait quelque chose de mal. Quelqu'un pourrait-il me diriger dans la bonne direction?

Essayez la première requête avec ces données: INSERT INTO TEST ( id, test1, test2 ) VALUES ( 1, 'C', 'B' ) INSERT INTO TEST ( id, test1, test2 ) VALUES ( 2, 'B', 'C' ) Qui devrait vous donner à la fois les lignes.

OriginalL'auteur Kyle | 2009-12-11