Nun, der ANSI092-Standard enthält eine ziemlich abscheuliche Syntax. Natürliche Verknüpfungen sind eine und die USING-Klausel eine andere. IMHO sollte das Hinzufügen einer Spalte zu einer Tabelle den Code nicht beschädigen, aber ein NATURAL JOIN wird auf äußerst ungeheure Weise unterbrochen. Der "beste" Weg, um zu brechen, ist ein Kompilierungsfehler. Wenn Sie beispielsweise irgendwo SELECT * auswählen, kann eine Spalte hinzugefügt werdennicht kompilieren. Der nächstbeste Fehler wäre ein Laufzeitfehler. Es ist schlimmer, weil Ihre Benutzer es vielleicht sehen, aber es gibt Ihnen trotzdem eine nette Warnung, dass Sie etwas kaputt gemacht haben. Wenn Sie ANSI92 verwenden und Abfragen mit NATURAL-Joins schreiben, wird diese zur Kompilierungszeit nicht und zur Laufzeit nicht unterbrochen. Die Abfrage führt plötzlich zu falschen Ergebnissen. Diese Arten von Fehlern sind heimtückisch. Berichte gehen schief, möglicherweise sind finanzielle Angaben falsch.
Für diejenigen, die mit NATURAL Joins nicht vertraut sind. Sie verbinden zwei Tabellen mit jedem Spaltennamen, der in beiden Tabellen vorhanden ist. Was wirklich cool ist, wenn Sie einen 4-Spalten-Schlüssel haben und es satt haben, ihn zu tippen. Das Problem tritt auf, wenn Tabelle1 eine bereits vorhandene Spalte mit dem Namen BESCHREIBUNG enthält und Sie Tabelle2 eine neue Spalte mit dem Namen "Oh, ich weiß nicht" hinzufügen, die harmlos ist wie "mmm" BESCHREIBUNG. Jetzt verbinden Sie die beiden Tabellen auf einem VARCHAR2 (1000) Feld, das freie Form ist.
Die USING-Klausel kann zusätzlich zu dem oben beschriebenen Problem zu völliger Mehrdeutigkeit führen. In einem anderen SO-Beitrag zeigte jemand dieses ANSI-92-SQL und bat um Hilfe beim Lesen.
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
Dies ist völlig mehrdeutig. Ich habe eine UserID-Spalte sowohl in Unternehmen als auch in Benutzertabellen eingefügt, und es gibt keine Beschwerde. Was ist, wenn die UserID-Spalte in Unternehmen die ID der letzten Person ist, die diese Zeile geändert hat?
Ich meine es ernst. Kann jemand erklären, warum solche Unklarheiten notwendig waren? Warum ist es direkt in den Standard eingebaut?
Ich denke, Bill hat Recht, dass es eine große Basis von Entwicklern gibt, die dort durch Codierung kopieren / einfügen. Tatsächlich kann ich zugeben, dass ich in Bezug auf ANSI-92 eine Art bin. Jedes Beispiel, das ich jemals gesehen habe, zeigte mehrere Verknüpfungen, die in Klammern verschachtelt waren. Ehrlichkeit, das macht es bestenfalls schwierig, die Tische im SQL auszuwählen. Aber dann erklärte ein SQL92-Evangilist, dass dies tatsächlich eine Join-Reihenfolge erzwingen würde. JESUS ... all diese Copy-Paster, die ich gesehen habe, erzwingen jetzt tatsächlich eine Join-Reihenfolge - ein Job, der in 95% der Fälle besser Optimierern überlassen bleibt, insbesondere einem Copy / Paster.
Tomalak hat es richtig gemacht, als er sagte:
Leute wechseln nicht zu neuer Syntax, nur weil sie da ist
Es muss mir etwas geben und ich sehe keinen Vorteil. Und wenn es einen Vorteil gibt, sind die Negative ein Albatros, der zu groß ist, um ignoriert zu werden.