Eh bien, la norme ANSI092 comprend une syntaxe assez atroce. Les jointures naturelles en font partie, tout comme la clause USING. À mon avis, l'ajout d'une colonne à une table ne devrait pas casser le code, mais une jointure naturelle le fait de la manière la plus flagrante. La "meilleure" façon de casser est par une erreur de compilation. Par exemple, si vous faites SELECT * quelque part, l'ajout d'une colonne pourrait échouer à la compilation. La deuxième meilleure façon d'échouer serait une erreur d'exécution. C'est pire car vos utilisateurs pourraient le voir, mais cela vous donne quand même un avertissement que vous avez cassé quelque chose. Si vous utilisez ANSI92 et écrivez des requêtes avec des jointures naturelles, cela ne cassera pas lors de la compilation et ne cassera pas lors de l'exécution, la requête commencera simplement à produire soudainement de mauvais résultats. Ces types de bugs sont insidieux. Les rapports se faussent, les divulgations financières potentielles sont incorrectes.
Pour ceux qui ne connaissent pas les jointures naturelles. Elles joignent deux tables sur chaque nom de colonne qui existe dans les deux tables. C'est vraiment cool lorsque vous avez une clé à 4 colonnes et que vous en avez marre de la taper. Le problème survient lorsque la Table1 a une colonne préexistante nommée DESCRIPTION et que vous ajoutez une nouvelle colonne à Table2 nommée, oh je ne sais pas, quelque chose d'anodin comme, mmm, DESCRIPTION et maintenant vous joignez les deux tables sur un champ VARCHAR2(1000) qui est libre.
La clause USING peut conduire à une ambiguïté totale en plus du problème décrit ci-dessus. Dans un autre message SO, quelqu'un a montré ce SQL ANSI-92 et a demandé de l'aide pour le lire.
SELECT c.*
FROM companies AS c
JOIN users AS u USING(companyid)
JOIN jobs AS j USING(userid)
JOIN useraccounts AS us USING(userid)
WHERE j.jobid = 123
C'est complètement ambigu. J'ai mis une colonne UserID dans les tables Companies et users et il n'y a aucune plainte. Et si la colonne UserID dans les companies est l'ID de la dernière personne à avoir modifié cette ligne ?
Je suis sérieux, quelqu'un peut-il expliquer pourquoi une telle ambiguïté était nécessaire ? Pourquoi est-elle intégrée directement dans la norme ?
Je pense que Bill a raison, il y a une grande base de développeurs qui copient/collent leur code de cette façon. En fait, je peux admettre que je suis un peu comme ça quand il s'agit de ANSI-92. Chaque exemple que j'ai vu montrait plusieurs jointures imbriquées entre parenthèses. Honnêtement, cela rend le repérage des tables dans la requête SQL difficile au mieux. Mais ensuite, un évangéliste de SQL92 a expliqué que cela forcerait en fait un ordre de jointure. MON DIEU... tous ces copieurs-collateurs que j'ai vus forcent maintenant réellement un ordre de jointure - une tâche qui est 95% du temps mieux laissée aux optimiseurs, surtout un copieur-collateur.
Tomalak a raison quand il a dit,
les gens ne passent pas à une nouvelle syntaxe juste parce qu'elle est là
Cela doit me donner quelque chose et je ne vois aucun avantage. Et s'il y a un avantage, les inconvénients sont un fardeau trop grand pour être ignoré.
7 votes
Un avantage principal de la notation JOIN SQL-92 est qu'il existe une manière standard et relativement saine d'écrire LEFT OUTER JOIN et ses variantes. Chaque SGBD avait sa propre syntaxe de variante (généralement mauvaise ; en fait, je pense, sans exception, les notations étaient mauvaises) et souvent avec des sémantiques légèrement différentes. SQL-92 a corrigé cela, et la nouvelle notation vaut la peine d'être utilisée sur ces seuls motifs. Je pense que c'est plus clair de toute façon, une fois que vous y êtes habitué. Cela prend un peu de temps pour s'y habituer, mais ce n'est pas difficile, et une fois converti, il n'y a pas de retour en arrière.
0 votes
Sémantique, sémantique, anti-sémantique!
0 votes
Je suis un peu en retard pour la fête ici, mais personne n'a semblé avoir souligné qu'Oracle lui-même recommande d'utiliser la syntaxe OUTER JOIN de la clause FROM plutôt que l'opérateur de jointure Oracle
0 votes
J'ai ajouté une nouvelle réponse qui est beaucoup plus à jour et directe, avec une clarification sur d'autres idées fausses dans les réponses ici stackoverflow.com/a/47720615/124486