Sql-Server

如何視覺化內部查詢與其各自外部查詢之間的連接?

  • February 3, 2020

當內部查詢連接到它的外部查詢時,我似乎總是無法想像其含義。

這是一個例子:

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

引用自:https://dba.stackexchange.com/questions/258444