Usi Two LEFT JOIN o usi AND con single LEFT JOIN?


7

Usando due LEFT JOINs ie

SELECT <some columns>
FROM Table1 AS t1
LEFT JOIN Table2 AS t2 ON <condition1>
LEFT JOIN Table2 AS t3 ON <condition2>

è lo stesso che usare ANDin single LEFT JOIN? vale a dire

SELECT <some columns>
FROM Table1 AS t1
LEFT JOIN Table2 AS t2 ON <condition1>
AND <condition2>

Entrambi sono uguali o diversi (in generale)?


Dipende dalle vostre esigenze e dalle condizioni ON. Se si inserisce t1.col1 = t2.col1 con Table2 e t1.col1.t3.col1 Sarebbe lo stesso.

2
La seconda query sarebbe più vicina alla prima in termini di risultati se usasse OR anziché AND, ma sarebbe comunque una query diversa in generale .
Andriy M,

Prova a usare il piano Spiega per vedere la differenza :)
Arnab Datta,

@RajeshRanjan no, non sarebbero equivalenti, anche in quel caso.
ypercubeᵀᴹ

Risposte:


13

Sono diversi. Nella prima opzione ottieni 2 volte Table2nella tua query. Una volta come t2e una volta come t3. Entrambi hanno un contenuto diverso e devi rimetterli insieme in qualche modo. Per me questo è più un OR invece di un AND . Nella seconda opzione ottieni solo le Table2righe che soddisfano entrambi i criteri.

Supponiamo di avere Table2con il seguente contenuto:

| Color | Size |
|-------|------|
| Red   |  S   |
| Blue  |  S   |
| Blue  |  XS  |

Supponiamo di voler avere le righe che sono Bluee S. Nella tua prima opzione ottieni tutte le righe ( t2ad esempio con tutto Bluee t3con tutto S) e nella tua seconda opzione ottieni solo la riga 2.


4
Non solo, ma poiché si tratta di unire due volte la tabella esterna, otterrai anche un prodotto mini-cartesiano con la prima query. Voglio dire, una Table1riga vuole colore blu e taglia S. Quindi, il primo join gli dà due Table2corrispondenze, duplicando così la Table1riga, e il secondo join dà due corrispondenze per ciascuna delle copie, risultando in totale quattro righe.
Andriy M,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.