混合隱式與顯式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中文網其他相關文章!