[英]When I add a LEFT OUTER JOIN, the query returns only a few rows
原始查詢返回16萬行。 當我添加左外連接時:
LEFT OUTER JOIN Table_Z Z WITH (NOLOCK) ON A.Id = Z.Id
該查詢僅返回150行。 我不確定自己在做什么錯。
我需要做的就是在查詢中添加一列,這將從另一個表中帶回代碼。 該代碼可以是數字或NULL。 我仍然必須顯示NULL,因此是LEFT加入的原因。 他們應該加入“ id”列。
SELECT <lots of stuff> + the new column that I need (called "code").
FROM
dbo.Table_A A WITH (NOLOCK)
INNER JOIN
dbo.Table_B B WITH (NOLOCK) ON A.Id = B.Id AND A.version = B.version
--this is where I added the LEFT OUTER JOIN. with it, the query returns 150 rows, without it, 160k rows.
LEFT OUTER JOIN
Table_Z Z WITH (NOLOCK) ON A.Id = Z.Id
LEFT OUTER JOIN
Table_E E WITH (NOLOCK) ON A.agent = E.agent
LEFT OUTER JOIN
Table_D D WITH (NOLOCK) ON E.location = D.location
AND E.type = 'Organization'
AND D.af_type = 'agent_location'
INNER JOIN
(SELECT X , MAX(Version) AS MaxVersion
FROM LocalTable WITH (NOLOCK)
GROUP BY agemt) P ON E.agent = P.location AND E.Version = P.MaxVersion
有誰知道導致問題的原因是什么?
當在表A
和E
之間執行LEFT OUTER JOIN
,您將維護A
原始數據集。 也就是說,表E
中沒有數據,或者沒有數據可以減少查詢中的行數。
但是,當您在底部的E
和P
之間執行INNER JOIN時,您實際上是在敞開心to,以減少返回的行數。 這將像對待后續的LEFT OUTER JOIN
一樣對待INNER JOIN
。
現在,如果沒有確切的架構和一組要測試的數據,這可能不是您遇到的確切問題。 但是,通常,始終將INNER JOIN
放在OUTER JOIN
之前。 它可以使編寫這樣的查詢變得非常容易。 最嚴格的聯接首先出現,然后您不必擔心以后會斷開任何外部聯接。
作為快速解決方案,請嘗試將最后一個P
LEFT OUTER JOIN
更改為LEFT OUTER JOIN
,以查看Z
LEFT OUTER JOIN
是否有效。
一旦開始使用LEFT JOIN,就必須非常小心。 讓我們假設這個模型:您有表格Products , Orders和Customer 。 並非所有產品都必須已訂購,但每個訂單都必須輸入客戶。
任務:顯示所有產品,如果訂購了產品,請列出訂購客戶; 也就是說,沒有訂單的產品將顯示為一行,具有10個訂單的產品將在結果集中顯示10行。 這要求圍繞FROM Products LEFT JOIN Orders
設計的查詢。
現在有人可以想到“好吧,客戶總是被輸入訂單,因此我可以inner join from orders to customers
進行inner join from orders to customers
”。 錯了 。 由於表Customers是通過左聯接表Orders聯接的,因此它自身必須是左聯接的...否則內部聯接將傳播到先前的級別,結果,您將丟失所有沒有聯接的產品命令。
也就是說,一旦使用LEFT JOIN連接任何表,通過該表連接的任何后續表都需要保留LEFT JOIN。 但這並不意味着一旦您使用了LEFT JOIN,所有的聯接都必須是該類型的……僅依賴於第一次執行的LEFT JOIN的那些聯接。 例如,如果只想查看具有類別集的產品,則可以將“ 產品 ”表與另一個表“ 類別”進行內連接。
(答案基於此答案: http : //www.sqlservercentral.com/Forums/Topic247971-8-1.aspx- >最后一個條目)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.