原始查询返回160k行。当我添加LEFT OUTER JOIN时:
LEFT OUTER JOIN Table_Z Z WITH (NOLOCK) ON A.Id = Z.Id
查询只返回150行。我不确定我做错了什么。
我需要做的就是在查询中添加一个列,它将从不同的表中返回一个代码。代码可以是数字或NULL。我仍然需要显示NULL,因此左键连接的原因。他们应该加入“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
有没有人知道造成这个问题的原因是什么?
答案 0 :(得分:2)
当您在表LEFT OUTER JOIN
和A
之间执行E
时,您将保留A
的原始数据集。也就是说,表E
中没有可以减少查询中行数的数据或缺少数据。
但是,当您在底部的E
和P
之间执行INNER JOIN时,您确实可以减少返回的行数。这会将您的后续LEFT OUTER JOIN
视为INNER JOIN
s。
现在,如果没有您确切的架构和一组要测试的数据,这可能是您正在遇到的问题,也可能不是。但是,作为一般规则,始终将INNER JOIN
s放在OUTER JOIN
之前。它可以使写这样的查询变得更加容易。你最严格的连接首先出现,然后你不必担心以后破坏你的任何外连接。
作为快速解决方法,请尝试将上次加入更改为P
至LEFT OUTER JOIN
,以查看Z
加入是否有效。
答案 1 :(得分:0)
一旦开始LEFT JOIN,你必须非常小心。 让我们假设这个模型:您有表产品,订单和客户。并非所有产品都必须订购,但每个订单都必须输入客户。
任务:显示所有产品,如果订购了产品,请列出订购客户;即,没有订单的产品将显示为一行,具有10个订单的产品将在结果集中显示10行。这需要围绕FROM Products LEFT JOIN Orders
设计的查询。
现在有人可以思考&#34;好的,客户总是订单,所以我可以inner join from orders to customers
&#34;。的错误的即可。由于表客户通过左连接表订单加入,因此必须自行连接...否则内部联接将传播到上一级别,因此,您将丢失所有没有的产品订单。
也就是说,一旦使用LEFT JOIN加入任何表,通过该表连接的任何后续表都需要保持LEFT JOIN。但这并不意味着一旦你使用LEFT JOIN,所有连接都必须属于那种类型......只有那些依赖于第一次执行LEFT JOIN的连接。如果您只想查看设置了类别的产品,那么将表产品与其他表类别联系起来是完全没问题的。
(答案基于以下答案:http://www.sqlservercentral.com/Forums/Topic247971-8-1.aspx - &gt;最后一项)