我目前正在将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返回相同的行。
答案 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?