2009-03-27 5 views
14

Y at-il une différence significative entre les éléments suivants?SQL JOIN: ON vs égal à

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

ET

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

utilisateurs ont SO Faites une préférence de l'un sur l'autre?

Répondre

21

Il n'y a pas de différence, mais la lisibilité de la seconde est bien meilleure lorsque vous avez une grande requête multi-jointure avec des clauses where supplémentaires pour le filtrage.
La séparation des clauses de jointure et les clauses de filtrage est une bonne chose :)

+1

Il n'y a pas de différence pour cette requête, mais pour d'autres requêtes, il y a certaines choses que vous pouvez faire avec la syntaxe de style 'INNER JOIN' que vous ne pouvez pas faire avec la syntaxe a, b. –

+0

Joel: Très vrai :) –

0

Aucune différence. Je trouve le premier format plus lisible et n'utilise le second format que pour faire d'autres types de jointures (OUTER, LEFT INNER, etc).

8

La première est la norme ANSI 89 syntaxe, celle-ci est ANSI 92.

Pour cette requête spécifique il n'y a pas de différence. Cependant, avec le premier vous perdez la possibilité de séparer un filtre d'une condition de jointure dans des requêtes complexes, et la syntaxe pour spécifier GAUCHE vs DROIT vs INNER est souvent déroutante, surtout si vous devez aller et venir entre différents fournisseurs de DB. Je n'aime pas du tout l'ancienne syntaxe.

0

La seconde forme est la syntaxe conforme à SQL92. Cela devrait signifier qu'il est pris en charge par tous les fournisseurs de bases de données actuels et futurs. Cependant, la vérité est que la première forme est si omniprésente qu'elle est également garantie pour être plus longtemps que nous nous soucions.

Sinon, ils sont identiques à tous égards dans la façon dont les bases de données traitent les deux.

3

Il n'y a pas de différence avec le moteur de recherche sql. Pour des raisons de lisibilité, cette dernière est beaucoup plus facile à lire si vous utilisez des sauts de ligne et des indentations. Pour INNER JOINs, peu importe si vous mettez des "filtres" et des "jointures" dans la clause ON ou WHERE, l'optimiseur de requêtes doit décider quoi faire en premier (il peut choisir de faire un filtre en premier, une jointure plus tard, ou vice versa

Pour les JOINTS EXTERNES cependant, il y a une différence, et parfois vous voudrez mettre la condition dans la clause ON, parfois dans le WHERE Mettre une condition dans la clause WHERE pour un OUTER JOIN peut tourner dans un INNER JOIN (à cause de la façon dont fonctionnent les valeurs NULL)

Par exemple, vérifier la lisibilité entre les deux exemples suivants:

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

Mettre une condition dans une clause where par rapport à une clause de jointure est très important pour les jointures externes. –

+0

Pourquoi cela a-t-il été déprécié? Je vote pour le sauvegarder. Brimstedt montre simplement que la deuxième version est plus facile à lire (et je suis d'accord avec lui). Les jointures et les filtres sont, conceptuellement, deux choses différentes. – Cybis

+0

ah, oui pour les jointures externes cela fait une différence .. merci de l'avoir signalé, Ill modifier ma réponse pour l'exhaustivité – Brimstedt

1

Alors que vous pouvez effectuer la plupart des tâches à l'aide à la fois et dans votre cas, il n'y a pas de différence que ce soit, je vais toujours utiliser la seconde en tout temps.

  1. Il est la norme
  2. actuelle pris en charge Il maintient joint dans la clause FROM et des filtres dans la clause WHERE
  3. Il fait parti plus complexe, droite, FULL OUTER rejoint beaucoup plus facile
  4. MSSQL Aide est tout basé autour de cette syntaxe donc beaucoup plus facile d'obtenir de l'aide sur vos requêtes problème
1

Bien qu'il n'y ait pas de différence technique, vous devez faire très attention à faire des jointures en utilisant la première méthode. Si vous vous trompez par accident, vous pourriez finir par faire une jointure cartésienne entre vos tables a et b (très longue, mémoire & requête intensive cpu - il va correspondre à chaque ligne dans un avec toutes les lignes dans b. et b sont de grandes tables pour commencer). L'utilisation d'un INNER JOIN explicite est à la fois plus sûre et plus facile à lire.