暗黙的結合と明示的結合の混合
これは未解決の質問ですが、SQL で暗黙的な JOIN と明示的な JOIN を混在させると、構文が無効になります。明示的および暗黙的な JOIN は個別に機能しますが、結合するとエラーが発生する可能性があります。
次のパターン例を考えてみましょう:
<code class="language-sql">CREATE TABLE Employee ( employeeID INT, name VARCHAR(255), managerEmployeeID INT )</code>
とサンプルデータ:
<code class="language-sql">INSERT INTO Employee (employeeID, name) VALUES (1, 'Gary') INSERT INTO Employee (employeeID, name, managerEmployeeID) VALUES (2, 'Bob', 1)</code>
次の明示的な JOIN クエリは、期待どおりの結果を取得します:
<code class="language-sql">SELECT e1.name, e2.name, e1Manager.name FROM Employee e1 CROSS JOIN Employee e2 INNER JOIN Employee e1Manager ON e1.managerEmployeeID = e1Manager.employeeID</code>
同様に、この暗黙的な JOIN クエリも機能します。
<code class="language-sql">SELECT e1.name, e2.name, e1Manager.name FROM Employee e1, Employee e2, Employee e1Manager WHERE e1.managerEmployeeID = e1Manager.employeeID</code>
無効な SQL
ただし、暗黙的な JOIN と明示的な JOIN を混在させようとすると、次のようになります。
<code class="language-sql">SELECT e1.name, e2.name, e1Manager.name FROM Employee e1, Employee e2 INNER JOIN Employee e1Manager ON e1.managerEmployeeID = e1Manager.employeeID</code>
MSSQL 2000/2008 と MySQL の両方でエラーが発生します。 MS2000 のエラーは次のとおりです:
<code>列前缀'e1'与查询中使用的表名或别名不匹配。</code>
MySQL では、エラーは次のとおりです:
<code>'on'子句中未知列'e1.managerEmployeeID'。</code>
この構文はなぜ無効ですか?
SQL 標準では、JOIN キーワードがカンマよりも優先されると規定しています。ただし、テーブルの別名は、対応するテーブルが FROM 句で評価された後にのみ使用できます。
混合 JOIN クエリでは、JOIN...ON 式は e1 を参照しますが、テーブルのカンマ区切りリストがまだ処理されていないため、e1 はまだ評価されていません。
追加: Hibernate に明示的な JOIN を強制的に使用する
残念ながら、Hibernate の HQL ドキュメントを調査したところ、明示的な JOIN の使用を強制する方法に関する情報は見つかりませんでした。
以上がSQL で暗黙的な JOIN と明示的な JOIN を混在させると無効な構文になるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。