left - SQL JOIN: c'è una differenza tra USING, ON o WHERE?



left outer join (4)

Mi chiedevo se ci sia qualche differenza nel modo in cui SQL esegue su queste istruzioni di join:

SELECT * FROM a,b WHERE a.ID = b.ID

SELECT * FROM a JOIN b ON a.ID = b.ID

SELECT * FROM a JOIN b USING(ID)

C'è una differenza di prestazioni? O differenza algoritmica?

O è solo zucchero sintattico?

https://src-bin.com


Answer #1

Disprezzo quando forzate un join usando WHERE . Non mi sembra giusto, un trucco sporco. Un join ANSI appropriato deve essere utilizzato su ON:

SELECT 
    p.Product,
    o.Order
FROM 
    Product p
INNER JOIN
    Order o
ON
    o.OrderID = p.OrderID

Preferisci usare ON quando ti unisci e WHERE filtra i risultati. Ricorda DOVE è una delle ultime cose che userai oltre al raggruppamento e all'ordine per cui vuoi filtrare i risultati. Quindi non dovresti unirti alle tue tabelle usando WHERE dato che è molto difficile da leggere.

SELECT 
    p.Product,
    o.Order
FROM 
    Product p
INNER JOIN
    Order o
ON
    o.OrderID = p.OrderID
WHERE
    o.Category = 'IT'

Alla fine tu (lo sviluppatore) potresti non essere in giro in futuro, la leggibilità e la manutenibilità aiuteranno l'anima che deve prendere il controllo del tuo codice :).

Quando vedo gli sviluppatori utilizzare WHERE per unire le loro tabelle, di solito è un'indicazione che non conoscono abbastanza T-SQL. Questa è la mia opinione personale.



Answer #3

Non c'è differenza nelle prestazioni.

Tuttavia, il primo stile è ANSI-89 e ti farà spezzare le gambe in alcuni negozi. Compreso il mio. Il secondo stile è ANSI-92 ed è molto più chiaro.

Esempi:

Qual è il JOIN, che è il filtro?

FROM T1,T2,T3....
WHERE T1.ID = T2.ID AND
     T1.foo = 'bar' AND T2.fish = 42 AND
     T1.ID = T3.ID

FROM T1 
   INNER JOIN T2 ON T1.ID = T2.ID
   INNER JOIN T3 ON T1.ID = T3.ID
WHERE
   T1.foo = 'bar' AND T2.fish = 42

Se hai OUTER JOINs ( =* , *= ) il secondo stile funzionerà come pubblicizzato. Il primo probabilmente non sarà ed è anche deprecato in SQL Server 2005+

Lo stile ANSI-92 è anche più difficile da bollix. Con lo stile più vecchio si può facilmente finire con un prodotto cartesiano (cross join) se si perde una condizione. Otterrai un errore di sintassi con ANSI-92.

Modifica: alcuni ulteriori chiarimenti

  • Il motivo per cui non si usa "join the where" (implicito) è il risultato dodgy con join esterni.
  • Se usi OUTER JOINs espliciti + JOIN INNER impliciti otterrai comunque risultati dubbiosi + hai incoerenza nell'utilizzo

Non è solo sintassi : si tratta di avere una query semanticamente corretta

Modifica, dicembre 2011

L'ordine di elaborazione delle query logiche di SQL Server è FROM, ON, JOIN, WHERE ...

Quindi, se mischi "implicito WHERE inner join" e "explicit FROM outer join" molto probabilmente non otterrai risultati attesi perché la query è ambigua ...


Answer #4

Questo è un duplicato di questa domanda SO: join SQL impliciti e impliciti . Generalmente penso che la versione implicita (dove versione) sia cattiva e non chiara come esplicita (sulla versione). Penso anche che l'implicito sia deprezzato ma non al 100% su quello. Il piano di esecuzione è lo stesso per entrambi.





expression