很抱歉,如果标题有点令人困惑。基本上,我有三张桌子:
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.StatusOne
和b.StatusTwo
答案 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)