我目前正在将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 - MySQL LEFT JOIN .. ON ..条款,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5869233/