ANSI092標準にはかなり厄介な構文が含まれています。自然結合とUSING句は別のものです。私見、テーブルへの列の追加はコードを壊すべきではありませんが、NATURAL JOINは最も悪質な方法で壊れます。ブレークする「最善の」方法は、コンパイルエラーによるものです。たとえば、あなたが*どこかを選択した場合は、列の追加はできましたコンパイルに失敗しました。失敗する次善の方法は、実行時エラーです。ユーザーには表示される可能性があるため、さらに悪いことですが、何かが壊れているという警告が表示されます。ANSI92を使用し、NATURAL結合を使用してクエリを作成する場合、コンパイル時にブレークせず、実行時にブレークせず、クエリは突然誤った結果を生成し始めます。これらのタイプのバグは潜行性です。レポートが間違っている、潜在的に財務情報の開示が正しくない。
NATURALジョインに不慣れな方のために。両方のテーブルに存在するすべての列名で2つのテーブルを結合します。4列のキーがあり、それを入力するのにうんざりしている場合、これは本当にクールです。Table1にDESCRIPTIONという名前の既存の列があり、Table2という名前の新しい列を追加したときに問題が発生します。わかりません、mmm、DESCRIPTIONのような無害なもので、VARCHAR2の2つのテーブルを結合しています(1000)自由形式のフィールド。
USING句は、上記の問題に加えて、完全なあいまいさをもたらす可能性があります。別のSOの投稿で、誰かがこのANSI-92 SQLを示し、それを読むのを手伝ってほしいと頼んだ。
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
これは完全にあいまいです。会社とユーザーの両方のテーブルにUserID列を配置しましたが、文句はありません。会社のUserID列がその行を最後に変更した最後の人のIDである場合はどうなりますか?
私は真面目です、なぜそのような曖昧さが必要だったのか誰か説明できますか?なぜ標準に直接組み込まれているのですか?
私はビルが正しいと思います。コーディングを通してそこにコピー/ペーストする開発者の大きな基盤があるということです。実際、ANSI-92に関して言えば、私は一種だと認めることができます。これまでに見たすべての例では、複数の結合が括弧内にネストされていました。正直なところ、SQLでテーブルを選択することはせいぜい困難です。しかし、SQL92 evangilistは、それが実際に結合順序を強制するだろうと説明しました。JESUS ...私が見たこれらすべてのコピーペースターは、実際には結合順序を強制しています。つまり、ジョブの95%が、オプティマイザ(特にコピー/ペースト)に委ねられています。
トマラックは彼が言ったときにそれを正しく理解しました、
そこにあるからといって、人々は新しい構文に切り替えない
それは私に何かを与える必要があり、私は上向きを見ていません。そして、良い面があれば、ネガティブは無視できない大きすぎるアホウドリです。