簡體   English   中英

MySQL LEFT JOIN.. ON.. 子句

[英]MySQL LEFT JOIN .. ON .. CLAUSE

我目前正在將 MySQL db 移植到另一個 DBMS。 我遇到了具有以下結構的以下查詢。

SELECT ... FROM table1 AS tb1 
      LEFT JOIN Table2 AS tb2 
             ON tb1.x = tb2.x 
             AND tb2.y = 2 AND tb2.z = 3 ...

我的目標 DBMS(DB2)“AND tb2.y = 2 AND tb2.z = 3”不允許以下結構,因此我將其移至 WHERE 子句。 不幸的是,在移動它之后,查詢似乎沒有從 MySQL 返回相同的行。

在外連接中,當將謂詞從ON子句移動到WHERE子句時,您必須允許連接產生不匹配的記錄,因此外部表中的列都是NULL

我沒有 DB2 經驗,所以可能還有其他我不知道的細微之處,但這就是我重寫查詢的方式。 檢查連接列中的NULL是連接是否找到匹配項的直接指標。

SELECT ... FROM table1 AS tb1 
      LEFT JOIN Table2 AS tb2 
             ON tb1.x = tb2.x 
      WHERE tb2.x IS NULL
         OR (tb2.y = 2 AND tb2.z = 3)

嘗試這個:

SELECT ... 
    FROM table1 AS tb1 LEFT JOIN Table2 AS tb2 
        ON tb1.x = tb2.x ,
        tb2.y = 2 ,
        tb2.z = 3 ... 

您是否嘗試將其轉換為RIGHT JOIN

SELECT ... 
FROM Table2 AS tb2 
RIGHT JOIN ON table1 AS tb1 tb1.x = tb2.x 
WHERE tb2.y = 2 AND tb2.z = 3 ...

我認為 DB2 不允許使用as的表別名(但我現在手頭沒有 DB2)

嘗試

SELECT ... 
FROM table1 tb1 
    LEFT JOIN Table2 tb2 ON tb1.x = tb2.x AND tb2.y = 2 AND tb2.z = 3 

(注意表as后面的缺失)

編輯:我剛剛檢查了 DB2 手冊,AS 似乎是有效的....
(但我現在先離開這個帖子)

顯然 DB2 只會在比較中使用列名。 也許您可以以某種方式人為地在連接表中創建具有這些值的列? 你收到錯誤-338嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM