MySQL LEFT JOIN .. ON .. CLAUSE

时间:2011-05-03 12:10:36

标签: mysql sql db2

我目前正在将MySQL数据库移植到另一个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返回相同的行。

5 个答案:

答案 0 :(得分: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 :(得分:1)

试试这个:

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

答案 2 :(得分: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 ...

答案 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似乎是有效的.... (但我现在要离职了)

答案 4 :(得分:0)

显然DB2只会在比较中使用列名。也许你可以以某种方式人工创建在连接表中具有这些值的列?你得到错误-338?