簡體   English   中英

當我添加一個LEFT OUTER JOIN時,查詢僅返回幾行

[英]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

有誰知道導致問題的原因是什么?

當在表AE之間執行LEFT OUTER JOIN ,您將維護A原始數據集。 也就是說,表E中沒有數據,或者沒有數據可以減少查詢中的行數。

但是,當您在底部的EP之間執行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,就必須非常小心。 讓我們假設這個模型:您有表格ProductsOrdersCustomer 並非所有產品都必須已訂購,但每個訂單都必須輸入客戶。

任務:顯示所有產品,如果訂購了產品,請列出訂購客戶; 也就是說,沒有訂單的產品將顯示為一行,具有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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM