我目前正在将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/

10-12 21:12