Eh bien, la norme ANSI092 inclut une syntaxe assez odieuse. Les jointures naturelles sont une et la clause USING en est une autre. À mon humble avis, l'ajout d'une colonne à une table ne devrait pas casser le code, mais un NATURAL JOIN se brise de la manière la plus flagrante. La "meilleure" façon de casser est par erreur de compilation. Par exemple, si vous SELECT * quelque part, l'ajout d'une colonne pourraitne parvient pas à compiler. La prochaine meilleure façon d'échouer serait une erreur d'exécution. C'est pire parce que vos utilisateurs peuvent le voir, mais cela vous avertit toujours que vous avez cassé quelque chose. Si vous utilisez ANSI92 et écrivez des requêtes avec des jointures NATURELLES, il ne se cassera pas au moment de la compilation et ne se cassera pas au moment de l'exécution, la requête commencera soudainement à produire des résultats erronés. Ces types de bugs sont insidieux. Les rapports tournent mal, la divulgation potentiellement financière est incorrecte.
Pour ceux qui ne connaissent pas NATURAL Joins. Ils joignent deux tables sur chaque nom de colonne qui existe dans les deux tables. Ce qui est vraiment cool lorsque vous avez une clé à 4 colonnes et que vous en avez assez de la taper. Le problème survient lorsque 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'innocent comme, mmm, DESCRIPTION et maintenant vous joignez les deux tables sur un VARCHAR2 (1000) champ de forme libre.
La clause USING peut conduire à une ambiguïté totale en plus du problème décrit ci-dessus. Dans un autre article 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 des entreprises et des utilisateurs et il n'y a pas de plainte. Que faire si la colonne UserID dans les entreprises est l'ID de la dernière personne à modifier cette ligne?
Je suis sérieux, quelqu'un peut-il expliquer pourquoi une telle ambiguïté était nécessaire? Pourquoi est-il intégré directement dans la norme?
Je pense que Bill a raison de dire qu'il existe une grande base de développeurs qui copient / collent là-bas à travers le codage. En fait, je peux admettre que je suis un peu un quand il s'agit d'ANSI-92. Chaque exemple que j'ai vu montre que plusieurs jointures sont imbriquées entre parenthèses. Honnêteté, cela rend au mieux le choix des tables dans le sql difficile. Mais un évangiliste SQL92 a expliqué que cela forcerait en fait un ordre de jointure. JESUS ... tous ces Copy-pasters que j'ai vus sont en train de forcer un ordre de jointure - un travail qui est 95% du temps mieux laissé aux optimiseurs, en particulier un copier / coller.
Tomalak a bien compris quand il a dit:
les gens ne passent pas à la nouvelle syntaxe simplement parce qu'elle est là
Cela doit me donner quelque chose et je ne vois pas d'avantage. Et s'il y a un avantage, les négatifs sont un albatros trop gros pour être ignoré.