-1

有没有人有一个非常好的示例,其中有两个具有 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 行,所以 a.xxxx 是无效的,因为它是一个列表,并且只能是 a.size ,这将是该 b 行的 a 行列表中的行数。

谢谢,院长

4

1 回答 1

1

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

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

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

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

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

但是,总的来说,A LEFT OUTER JOIN B它们B LEFT OUTER JOIN A是完全不同的。第一个保留 A 中的所有行,以及 B 中的匹配行(如果没有匹配,则为 NULL 值)。第二个保留 B 中的所有行,以及 A 中的所有匹配行(如果没有匹配,则为 NULL 值)。

于 2012-09-13T18:51:03.893 回答