我正在嘗試學習ansi-92 SQL標準,但我似乎並沒有完全理解它(我對ansi-89標準以及數據庫一般都不熟悉)。我誤解了聯結嗎?
在我的例子中,我有三個錶王國 - <家族 - <種(生物分類)。
- 有可能是沒有物種和家庭的王國。
- 可能有家庭沒有物種也沒有kindgoms。
- 有可能是沒有王國或家庭的物種。
爲什麼會發生這種情況?
說的生物學家發現一個新物種,但他並沒有分爲王國或家庭這一點,創建一個新的家族,有沒有種,是不知道什麼王國它應該屬於等
這裏是一個小提琴(看最後一個查詢):http://sqlfiddle.com/#!4/015d1/3
我想做一個查詢,檢索我的每個王國,每個物種,但沒有那些沒有物種的家庭,所以我做這個。
select *
from reino r
left join (
familia f
right join especie e
on f.fnombre = e.efamilia
and f.freino = e.ereino
) on r.rnombre = f.freino
and r.rnombre = e.ereino;
我認爲這會做的是:
家人團聚和物種右連接,所以它帶來的每一個物種,但不是那些沒有種家庭。所以,如果一個物種沒有被分類到一個家庭中,它就會在家庭中顯得無效。
然後,加入王國,結果作爲左連接,因此它帶來了每個王國,即使沒有家族或物種歸於該王國。
我錯了嗎?這不應該顯示那些未被分類的物種嗎?如果我做內部查詢它會帶來我想要的。我在分組的東西有問題嗎?
這是否混亂與Oracle不?我的查詢中的查詢優化,是括號不必要的?我得到相同的結果嗎? oracle的命令是什麼? – Roger 2012-03-28 05:41:15
@outis我必須恭敬地不同意這種連接語法不能嵌套。 [我相信,這篇文章討論這個話題(http://tonyhasler.wordpress.com/2009/02/22/parentheses-in-ansi-join-syntax/),並得出結論:可以使用括號明確的順序連接多個表時的操作。 – 2012-03-28 05:55:05
@MichaelFredrickson:我糾正了。它就是SQL/Foundation§7.6。 – outis 2012-03-28 07:38:41