SQL JOIN: y a-t-il une différence entre Utiliser, ON ou où?
je me demandais s'il y avait une différence dans la façon dont SQL fonctionne sur ces déclarations de jointure:
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)
y a-t-il une différence de performance? Ou différence algorithmique?
ou est-ce juste du sucre syntaxique?
5 réponses
il n'y a pas de différence de performances.
cependant, le premier style est ANSI-89 et vous obtiendrez les jambes cassées dans certains magasins. Y compris la mienne. Le second style est ANSI-92 et est beaucoup plus clair.
exemples:
Qu'est-ce que L'assemblage, qu'est-ce que le filtre?
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
si vous avez des jointures externes ( =*
, *=
) alors le 2ème style fonctionnera comme annoncé. Le premier ne le fera probablement pas et est également déprécié dans SQL Server 2005+
le style ANSI-92 est aussi plus difficile à bollix. Avec l'ancien style, vous pouvez facilement finir avec un produit cartésien (jointure croisée) si vous manquez une condition. Vous obtiendrez une erreur de syntaxe avec ANSI-92.
Edit: un peu plus de clarification
- la raison pour ne pas utiliser "join the where" (implicite) est les résultats douteux avec jointures externes.
- si vous utilisez les jointures externes explicites + les jointures internes implicites vous obtiendrez toujours des résultats douteux + vous avez une incohérence dans l'utilisation
il n'est pas seulement syntaxe : il s'agit d'avoir un sémantiquement correct requête
Édition, Décembre 2011
SQL Server logique traitement de la requête de l'ordre est à PARTIR, SUR, de REJOINDRE OÙ...
Donc, si vous mélangez "implicite où les jointures internes" et "explicite des jointures externes", vous n'obtiendrez probablement pas les résultats attendus parce que la requête est ambiguë...
la différence est la lisibilité et la maintenabilité. SELECT * FROM a JOIN b ON a.ID = b.ID
traduit votre intention exacte, Tous au même endroit.
Je ne dirai pas définitivement depuis que je n'ai pas obtenu sous le capot du dernier Optimizer de requête, mais je suis assez sûr que vous êtes à la recherche d'une différence insignifiante dans la performance, s'il y en a.
je méprise quand vous forcez une jointure en utilisant WHERE
. Pour moi, ça n'a pas l'air bien, un sale piratage. La jointure ANSI correcte est à utiliser sur:
SELECT
p.Product,
o.Order
FROM
Product p
INNER JOIN
Order o
ON
o.OrderID = p.OrderID
préfère utiliser ON
lors de l'assemblage et WHERE
pour filtrer les résultats. Rappelez-vous où est l'une des dernières choses que vous utiliserez en dehors du groupement et de l'ordre Par où vous voulez filtrer vos résultats. Donc vous ne devriez pas rejoindre vos tables en utilisant WHERE
car il est très difficile à lire.
SELECT
p.Product,
o.Order
FROM
Product p
INNER JOIN
Order o
ON
o.OrderID = p.OrderID
WHERE
o.Category = 'IT'
à la fin vous (le développeur) pourrait ne pas être autour dans le futur donc lisibilité et maintenabilité aidera l'âme de pour qui doit prendre en charge votre code :).
quand je vois des développeurs utiliser WHERE
pour rejoindre leurs tables, c'est généralement une indication qu'ils ne savent pas assez de T-SQL. C'est mon opinion personnelle.
c'est une copie de cette question SO: SQL explicite vs implicite rejoint . En général, je pense que l'implicite (où la version) est mauvaise et pas aussi clair que l'explicite (sur la version). Je pense également que l'implicite est déprécié, mais pas à 100% sur celui-ci. Le plan d'exécution est le même pour les deux.