当我添加LEFT OUTER JOIN时,查询只返回几行

时间:2012-12-03 20:22:51

标签: sql sql-server tsql left-join

原始查询返回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

有没有人知道造成这个问题的原因是什么?

2 个答案:

答案 0 :(得分:2)

当您在表LEFT OUTER JOINA之间执行E时,您将保留A的原始数据集。也就是说,表E中没有可以减少查询中行数的数据或缺少数据。

但是,当您在底部的EP之间执行INNER JOIN时,您确实可以减少返回的行数。这会将您的后续LEFT OUTER JOIN视为INNER JOIN s。

现在,如果没有您确切的架构和一组要测试的数据,这可能是您正在遇到的问题,也可能不是。但是,作为一般规则,始终将INNER JOIN s放在OUTER JOIN之前。它可以使写这样的查询变得更加容易。你最严格的连接首先出现,然后你不必担心以后破坏你的任何外连接。

作为快速解决方法,请尝试将上次加入更改为PLEFT 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;最后一项)