2009-03-27 12 views
14

Esiste una differenza significativa tra quanto segue?SQL JOIN: ON vs uguale a

SELECT a.name, b.name FROM a, b WHERE a.id = b.id AND a.id = 1

E

SELECT a.name, b.name FROM a INNER JOIN b ON a.id = b.id WHERE a.id = 1

farlo gli utenti hanno una preferenza di uno sopra l'altro?

risposta

21

Non c'è alcuna differenza, ma la leggibilità del secondo è molto meglio quando si dispone di una grande query multi-join con clausole extra where per il filtro.
Separare il join clausole e le clausole di filtro è una buona cosa :)

+1

Non c'è alcuna differenza per questa query, ma per altre query ci sono alcune cose che puoi fare con la sintassi di stile 'INNER JOIN' che non puoi fare con la sintassi di stile a, b. –

+0

Joel: molto vero :) –

0

Nessuna differenza. Trovo il primo formato più leggibile e uso il secondo formato solo quando si eseguono altri tipi di join (ESTERNO, SINISTRA INTERNO, ecc.).

8

Il primo è ANSI 89 sintassi, il secondo è ANSI 92.

Per che query specifica non c'è differenza. Tuttavia, con il primo si perde la capacità di separare un filtro da una condizione di join in query complesse e la sintassi per specificare LEFT vs RIGHT vs INNER è spesso confusa, soprattutto se si deve andare avanti e indietro tra diversi fornitori di database. Non mi piace affatto la sintassi più vecchia.

0

Il secondo modulo è la sintassi conforme a SQL92. Ciò dovrebbe significare che è supportato da tutti i fornitori di database attuali e futuri. Tuttavia, la verità è che la prima forma è così pervasiva che è anche garantito di essere in giro più a lungo di quanto ci interessi.

Altrimenti sono uguali in tutti gli aspetti nel modo in cui i database trattano i due.

3

Non c'è alcuna differenza nel motore di query sql.

Per la leggibilità, quest'ultimo è molto più facile da leggere se si utilizzano interruzioni di riga e rientro.

Per INNER JOINs, non importa se si inseriscono "filters" e "joins" nella clausola ON o WHERE, il Query Optimizer dovrebbe decidere comunque cosa fare prima (potrebbe scegliere di fare prima un filtro, un join in seguito, o viceversa

Per OUTER JOINs tuttavia, c'è una differenza, e talvolta si vuole mettere la condizione nella clausola ON, a volte nel WHERE. Mettendo una condizione nella clausola WHERE per un JOIN OUTER può girare in un INNER JOIN (a causa di come lavorano NULL)

Ad esempio, verificare la leggibilità tra i due seguenti campioni:

SELECT c.customer_no, o.order_no, a.article_no, r.price 
FROM customer c, order o, orderrow r, article a 
WHERE o.customer_id = c.customer_id 
AND r.order_id = o.order_id 
AND a.article_id = r.article_id 
AND o.orderdate >= '2003-01-01' 
AND o.orderdate < '2004-01-01' 
AND c.customer_name LIKE 'A%' 
ORDER BY r.price DESC 

vs

SELECT c.customer_no, o.order_no, a.article_no, r.price 
FROM customer c 
INNER JOIN order o 
    ON o.customer_id = c.customer_id 
    AND o.orderdate >= '2003-01-01' 
    AND o.orderdate < '2004-01-01' 
INNER JOIN orderrow r 
    ON r.order_id = o.order_id 
INNER JOIN article a 
    ON a.article_id = r.article_id 
WHERE c.customer_name LIKE 'A%' 
ORDER BY r.price DESC 
+0

Inserire una condizione in una clausola where rispetto a una clausola join è sicuramente importante per i join esterni. –

+0

Perché è stato downvoted? Sto votando di nuovo. Brimstedt stava semplicemente mostrando che la seconda versione è più facile da leggere (e sono d'accordo con lui). Join e filtri sono, concettualmente, due cose diverse. – Cybis

+0

ah, sì per outer join fa la differenza .. grazie per avermelo fatto notare, devo modificare la mia risposta per completezza – Brimstedt

1

Mentre è possibile eseguire la maggior parte delle attività utilizzando entrambi e nel tuo caso non v'è alcuna differenza, io sarò sempre utilizzare il secondo in ogni momento.

  1. E 'l'attuale supportato Standard
  2. Mantiene unisce nella clausola FROM e filtri nella clausola WHERE
  3. Rende SINISTRA più complesso, DESTRA, PIENO ESTERNO unisce molto più facile
  4. MSSQL Aiuto è tutto basato su tale sintassi quindi molto più facile da ottenere aiuto sulle tue domande problema
1

Mentre non c'è alcuna differenza tecnica, devi fare molta attenzione a fare join usando il primo metodo. Se ti capita di sbagliare per sbaglio, potresti finire per fare un join cartesiano tra le tue tabelle aeb (una query di memoria molto lunga, memoria & - corrisponderà a ogni singola riga in a con tutte le righe in b. e b sono tabelle di grandi dimensioni per cominciare). L'utilizzo di un INNER JOIN esplicito è più sicuro e più facile da leggere.