我目前正在将 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 返回相同的行。
最佳答案
在外连接中,当将谓词从 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)
关于MySQL LEFT JOIN .. ON .. 子句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5869233/