2012-09-13 54 views
-1

有沒有人有一個非常好的例子,其中有兩個表與一個OneToMany關係與表B進行左連接,因爲目標將不如僅使用表A進行左連接作爲使用WHERE子句的目標。OneToMany關係並加入where子句

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,它將是該行的行列表中的行數。

感謝, 院長

回答

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值)。

+0

啊,我認爲它會返回空行並返回b.isActive = true的行。好吧,所以我需要做的地方(a.fk = null || b.isActive = false)&& a.Number <15做到這一點,然後 –

+0

或者,coalesce(b.IsActive,false = false和a .Number <15'。 –

+0

如果表之間存在PK-FK(主鍵/外鍵)關係並且聯接位於PK-FK列上,則FK表中不應有任何不匹配PK表,因此與FK表作爲主表(LHS of join)的LEFT JOIN應該沒有意義(與常規聯接相同)。在相反的方向上,PK表中可能有行,但沒有相應的行在FK表中的行;因此,與PK表作爲主導表的LEFT JOIN可能是有意義的。 –