首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

SQL 多表 LEFT JOIN 寫法解析:ON 條件順序決定關聯邏輯

     編輯:程式設計疑難解答

原始語句

SELECT * FROM XUTEST
LEFT JOIN XUTEST2
LEFT JOIN XUTEST3 ON XUTEST2.SUPID = XUTEST3.SUPID
ON XUTEST3.SUPID = XUTEST.SUPID

執行邏輯(關鍵:JOIN 結合順序)

  1. 先做 XUTEST2 LEFT JOIN XUTEST3 ON XUTEST2.SUPID = XUTEST3.SUPID → 產生中間結果集 T23。
  2. 再做 XUTEST LEFT JOIN T23 ON XUTEST3.SUPID = XUTEST.SUPID。
  3. 此時 XUTEST 在第二個 ON 子句中可見,故 XUTEST3.SUPID = XUTEST.SUPID 合法。

修改後報錯語句

SELECT * FROM XUTEST
LEFT JOIN XUTEST2
LEFT JOIN XUTEST3 ON XUTEST.SUPID = XUTEST2.SUPID
ON XUTEST3.SUPID = XUTEST.SUPID

錯誤原因:第二個 LEFT JOIN XUTEST3 緊跟在 XUTEST2 後,其 ON 子句只能引用 XUTEST2 與 XUTEST3 的欄位。XUTEST 尚未加入關聯,故 XUTEST.SUPID 不可見 → 「標識符無效」。

標準易讀寫法(建議)

SELECT *
FROM XUTEST t1
LEFT JOIN XUTEST2 t2 ON t1.SUPID = t2.SUPID
LEFT JOIN XUTEST3 t3 ON t2.SUPID = t3.SUPID;
  • 每個 JOIN 緊跟其 ON,關聯關係一目瞭然。
  • 避免巢狀 JOIN 造成維護困難。

關鍵規則口訣

「JOIN 順序決定可見範圍,ON 只能看前面已 JOIN 的表。」

延伸:RIGHT JOIN / INNER JOIN 同理

所有 JOIN 類型皆遵循「從左到右依序建立關聯,ON 只能引用已出現的表別名」。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved