[英]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.