Sto cercando di trovare righe duplicate basate su colonne miste. Questo è un esempio di quello che ho:Confronto tabella SQL a se stesso (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')
Ora, se io funzionare questa domanda:
SELECT [LEFT].[ID]
FROM [TEST] AS [LEFT]
INNER JOIN [TEST] AS [RIGHT]
ON [LEFT].[ID] != [RIGHT].[ID]
WHERE [LEFT].[TEST1] = [RIGHT].[TEST2]
mi aspetto di tornare entrambi id. (1 e 2), tuttavia, torno sempre indietro di una riga.
I miei pensieri sarebbero che dovrebbe confrontare ogni riga, ma immagino che questo non sia corretto? Per fissare questo avevo cambiato la mia domanda di essere:
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]
che mi dà entrambe le righe, ma le prestazioni si riducono in modo estremamente rapido basato sul numero di righe.
La soluzione finale mi è venuta per per prestazioni e risultati è stato quello di utilizzare un'unione:
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]
Ma nel complesso, Sono ovviamente manca una comprensione del perché questo non sta funzionando il che significa che sono probabilmente facendo qualcosa di sbagliato. Qualcuno potrebbe indicarmi la giusta direzione?
Prova la prima query con questi dati: INSERT INTO TEST (id, test1, test2) VALORI (1, 'C', 'B') INSERT INTO TEST (id, test1, test2) VALORI (2, 'B', 'C') Questo dovrebbe fornire entrambe le righe. –