2012-12-13 8 views
11

Quando eseguo la seguente query:Perché INNER JOIN non uguale (! =) Appendere per sempre

SELECT * FROM `table1` 
INNER JOIN table2 ON table2.number = table1.number 

ottengo il risultato entro 2 secondi. Esistono circa 6 milioni di record in table2 e 1 milione di record in table1

table2.number e table1.number sono indicizzati.

Ora voglio ottenere un elenco di numeri che non esistono. Come questo:

Ci vuole sempre e ancora appeso .. Come risolvere?

+0

pensare a quante registra ognuno dei milioni in table2 che si uniranno ai milioni di table1. –

risposta

27

Diciamo che i primi INNER JOIN restituisce il 75% dei 1.000.000 di righe in table1. La seconda query non restituisce le altre 250.000 righe come si pensa. Invece, tenta di creare un prodotto cartesiano e rimuovere le 750.000 righe corrispondenti. Quindi sta cercando di restituire 6.000.000 × 1.000.000-750.000 righe. Questo è un rigonfiamento 6 set di risultati di riga.

probabilmente si desidera che questo:

SELECT * FROM table1 
LEFT JOIN table2 ON table2.number = table1.number 
WHERE table2.number IS NULL 

Questo restituisce le righe in table1 non presenti nel table2.

Potreste anche essere interessati a FULL OUTER JOIN:

SELECT * FROM table1 
FULL OUTER JOIN table2 ON table2.number = table1.number 
WHERE table1.number IS NULL AND table2.number IS NULL 

Questo restituisce le righe in entrambe le tabelle che non hanno una corrispondenza sull'altro tavolo.

6

Il motivo per cui questo non funziona è la causa di un semplice accesso a tutte le righe di table1 con ogni riga con la tabella 2. È necessario qualcosa con cui unirsi ancora. Il modo migliore per farlo è quello di fare un join di sinistra (significa che si unirà a table1 non importa cosa, ma non a table2) e quindi verificare che non ci sia una voce per table2 con il valore null. Dovrai quindi fare la stessa cosa per table2.

SELECT * FROM `table1` 
LEFT JOIN table2 ON table2.number = table1.number 
WHERE table2.number is NULL 

UNION 

SELECT * FROM `table2` 
LEFT JOIN table1 ON table2.number = table1.number 
WHERE table1.number is NULL 
+0

Bella risposta :-) –

0

Invece di questo si può utilizzare questo metodo: SELECT * FROM table1 LEFT JOIN tabella2 ON table2.number = table1.number DOVE table2.number è nullo o table1.number è NULL