将3个表连接在一起 - 其中一个表返回null结果。如何在WHERE子句中忽略此表?

时间:2016-12-08 14:35:46

标签: mysql sql sql-server join left-join

很抱歉,如果标题有点令人困惑。基本上,我有三张桌子:

  • MainTable
  • ItemsTable
  • ObjectsTable

MainTable上的ID(PK)是ItemsTable和ObjectsTable上的外键(因此MainTable在我的查询中永远不会返回null)。

现在的目标是将它们全部加入ID,然后使用所有三个表执行WHERE子句。这是查询:

select * from MainTable as a
left outer join ItemsTable as b
on a.ID = b.ID
left outer join ObjectsTable as c
on a.ID = c.ID
where 
a.ID = 9999 AND
(a.StatusOne = 1 and b.StatusOne = 1 and c.StatusOne = 1) AND
(a.StatusTwo != 1 or b.StatusTwo != 1 or c.StatusTwo != 1)

查询的想法是,如果它返回任何结果,我的代码中的变量设置为true,反之亦然。

只有在每个表都有ID时才能正常工作。但是,我遇到了ItemsTable没有任何带有该ID的记录的情况,因此查询没有返回任何结果,什么时候应该有。

我的问题是:

如何在WHERE子句中忽略NULL连接表?因此,如果ItemsTable为NULL,我仍然希望执行条件,只需而不用 b.StatusOneb.StatusTwo

2 个答案:

答案 0 :(得分:1)

我会将这些相关条件移到JOIN ON <{1}}

中的WHERE子句中
left outer join ItemsTable as b
on a.ID = b.ID and ( b.StatusOne = 1 or b.StatusTwo != 1)
left outer join ObjectsTable as c 
on a.ID = c.ID and (and c.StatusOne = 1 or c.StatusTwo != 1)
where a.ID = 9999 AND (a.StatusOne = 1  or a.StatusTwo != 1); 

答案 1 :(得分:1)

将限定语句移动到Where子句使左外连接成为INNER连接。以下将有效。

select * from MainTable as a
  left outer join ItemsTable as b
       on a.ID = b.ID and b.StatusOne = 1 and b.StatusTwo != 1 
  left outer join ObjectsTable as c
       on a.ID = c.ID c.StatusOne = 1 and c.StatusTwo != 1
  where 
    a.ID = 9999 AND
   (a.StatusOne = 1 and 
   (a.StatusTwo != 1)