Ich versuche, doppelte Zeilen basierend auf gemischten Spalten zu finden. Dies ist ein Beispiel dafür, was ich habe:Vergleichen der SQL-Tabelle mit sich selbst (Self-Join)
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')
Nun, wenn ich diese Abfrage ausführen:
SELECT [LEFT].[ID]
FROM [TEST] AS [LEFT]
INNER JOIN [TEST] AS [RIGHT]
ON [LEFT].[ID] != [RIGHT].[ID]
WHERE [LEFT].[TEST1] = [RIGHT].[TEST2]
ich erwarten würde beide Ids zurück zu bekommen. (1 und 2), aber ich komme immer nur die eine Zeile zurück.
Meine Gedanken wären, dass es jede Zeile vergleichen sollte, aber ich denke, das ist nicht korrekt? Um dies zu beheben, hatte ich meine Abfrage geändert werden:
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]
Was mich beide Reihen gibt, aber die Leistung beeinträchtigt extrem schnell auf der Grundlage der Anzahl der Zeilen.
Die endgültige Lösung, die ich für für die Leistung kam und Ergebnisse war eine Gewerkschaft zu verwenden:
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]
Aber alles in allem, ich bin fehlt offensichtlich ein Verständnis, warum dies nicht funktioniert, was bedeutet, dass ich bin wahrscheinlich etwas falsch machen. Könnte mir jemand in die richtige Richtung zeigen?
die erste Abfrage mit diesen Daten Versuchen: INSERT INTO TEST (id, Test1, Test2) VALUES (1, 'C', 'B') INSERT INTO TEST (id, Test1, Test2) VALUES (2, 'B', 'C') Das sollte Ihnen beide Zeilen geben. –