2011-05-03 106 views
0

我正在將MySQL數據庫移植到另一個DBMS。我遇到了以下結構的查詢。MySQL LEFT JOIN .. ON .. CLAUSE

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且tb2.z = 3」 不允許以下結構,所以我它移動到WHERE子句。不幸的是,在移動它後,查詢似乎沒有從MySQL返回相同的行。

+1

聽起來更像是代碼中的錯誤,而不是其他任何東西。也許真正的查詢可以幫助? – Remy 2011-05-03 12:13:26

回答

2

在外部聯接中,將謂詞從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) 
1

試試這個:

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

你試過將其轉換爲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 ... 
0

我認爲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似乎是有效的......
(但我會現在離開帖子)

0

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