首頁 >資料庫 >mysql教程 >為什麼在 SQL 中混合隱式和顯式 JOIN 語法無效?

為什麼在 SQL 中混合隱式和顯式 JOIN 語法無效?

Susan Sarandon
Susan Sarandon原創
2025-01-14 19:37:47342瀏覽

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

混合隱式與顯式JOIN

儘管這是一個懸而未決的問題,但在SQL中混合隱式和明確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時:

<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 語法無效?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn