Sql-Server
如何視覺化內部查詢與其各自外部查詢之間的連接?
當內部查詢連接到它的外部查詢時,我似乎總是無法想像其含義。
這是一個例子:
SELECT NM.MovieId, NM.MovieTitle FROM NinjaMovies AS NM WHERE EXISTS ( SELECT TOP 1 FROM Ninjas AS N INNER JOIN NinjaWeapons AS NW ON N.WeaponId = NW.WeaponId WHERE N.NinjaId = NM.NinjaId )
有沒有辦法在表格或排序圖中表示這個(或類似的內部查詢連接到外部查詢)?
只需將其分解為多個階段並考慮每個階段的輸出代表什麼
SELECT * FROM Ninjas AS N INNER JOIN NinjaWeapons AS NW ON N.WeaponId = NW.WeaponId
這可以被認為是“所有帶有至少一種武器及其武器的忍者”。數據模型似乎沒有將武器與特定電影聯繫起來。
因此,您現在只剩下要分析的更簡單的查詢(包含
TOP 1
在 an中沒有任何價值,EXISTS
因此也已被刪除。)SELECT NM.MovieId, NM.MovieTitle FROM NinjaMovies AS NM WHERE EXISTS ( SELECT * FROM WeaponOwningNinjasWithTheirWeapons AS N WHERE N.NinjaId = NM.NinjaId )
這裡似乎存在一個規範化問題,因為顯然
NinjaMovies
將包含多行由多個忍者主演的同一部電影,並在每個電影中重複標題 - 但NinjaMovies
它本身可能是一個由規範化表連接產生的視圖。在任何情況下都
SELECT NM.MovieId, NM.MovieTitle
清楚地從中選擇了電影 ID 和標題,因此唯一需要分析的是EXISTS
.
WeaponOwningNinjasWithTheirWeapons
這只是說只返回結果集中存在相應 Ninja 的行。所以總結一下。該查詢返回
NinjaMovies
相應忍者至少擁有一種武器的所有行。查詢的語義似乎有點奇怪,因為
NM.NinjaId
沒有預計到,所以如果電影中有多個忍者 - 有些有武器,有些沒有 - 沒有跡象表明哪個導致包含該行。如果您不關心這一點,那麼您可能應該添加一個DISTINCT
以刪除重複項,以防電影中出現多個帶有武器的忍者。
等效查詢:
SELECT NM.MovieId, NM.MovieTitle FROM NinjaMovies AS NM INNER JOIN Ninjas AS N ON N.NinjaId = NM.NinjaId INNER JOIN NinjaWeapons AS NW ON N.WeaponId = NW.WeaponId