ホームページ > データベース > mysql チュートリアル > SQL で暗黙的な JOIN と明示的な JOIN を混在させると無効な構文になるのはなぜですか?

SQL で暗黙的な JOIN と明示的な JOIN を混在させると無効な構文になるのはなぜですか?

Susan Sarandon
リリース: 2025-01-14 19:37:47
オリジナル
338 人が閲覧しました

Why is Mixing Implicit and Explicit JOINs in SQL Invalid Syntax?

暗黙的結合と明示的結合の混合

これは未解決の質問ですが、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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート