OneToMany关系并与where子句连接

时间:2012-09-13 18:47:07

标签: sql

有没有一个非常好的例子,其中有两个具有OneToMany关系的表,其中使用表B作为目标进行左连接比使用WHERE子句仅使用表A作为目标进行左连接更有用

Table A (ManyToOne with Table B)
Pk
Number
Fk

Table B
Pk
IsActive

我的意思是,我可以写一个像这样的连接

select * from TableA as a left outer join TableB as b on b.pk=a.fk where b.isActive=false and a.Number < 15

而不是写

select * from TableB as b left outer join TableA as a on b.pk=a.fk where b.isActive=false and a.Number < 15

我的意思是,如果我在noSQL系统上支持连接,我什么时候需要支持第二个,因为有人不能将它重写为上面的第一个并且有一个很好的用例,所以我可以当它被使用时我会把头包起来?

我问的原因是对象查询语言,我想知道我是否需要支持在这种情况下执行where子句(或者如果我只是禁止这样的话)...

 select b from TableB as b left fetch join b.tableAList as a where b.isActive=true and a.xxxxx = something

但不是那么无效,因为b有很多行,所以a.xxxx是无效的,因为它是一个列表而且实际上只能是a.size,它将是b的行列表中行的计数行。

感谢, 迪安

1 个答案:

答案 0 :(得分:1)

您的两个示例都是有效的内部联接。

执行左外连接时,第二个表中的值为NULL。您的WHERE子句是:

where b.isActive=false and a.Number < 15

NULL值将导致失败,删除从第二个表中添加的所有“虚拟”行。

如果你真的想要一个左外连接,那么你需要在ON子句而不是WHERE子句中包含它们。

一般而言,A LEFT OUTER JOIN BB LEFT OUTER JOIN A完全不同。第一个保留A中的所有行,匹配来自B的行(如果没有匹配则为NULL值)。第二行保留B中的所有行,所有匹配的行都来自A(如果没有匹配则为NULL值)。