一个LEFT OUTER JOIN如何能够返回比左表更多的logging?
我有一个非常基本的左外连接从左表中返回所有结果和一个更大的表中的一些额外的信息。 左表中包含4935条logging,当我左外部连接到一个额外的表logging数显着大。
据我所知,这是一个绝对的福音,一个LEFT OUTER JOIN将从左表中返回所有logging,右表中的匹配logging返回所有logging,任何不能匹配的行都返回null值,这是我的理解,它应该不可能返回比左边的表中更多的行,但是它们都是一样的!
SQL查询如下:
SELECT SUSP.Susp_Visits.SuspReason, SUSP.Susp_Visits.SiteID FROM SUSP.Susp_Visits LEFT OUTER JOIN DATA.Dim_Member ON SUSP.Susp_Visits.MemID = DATA.Dim_Member.MembershipNum
也许我在语法上犯了一个错误,或者我对LEFT OUTER JOIN的理解是不完整的,不pipe我在这里发疯的原因是什么,希望有人能解释这可能是怎么发生的?
后记
感谢grea的回答,我对LEFT OUTER JOINS的理解现在好多了,但是谁能提出这样一个查询可以被修改的方法,这样我只能得到左表中返回的logging数量呢?
这个查询纯粹是为了生成一个报告,重复的匹配只是混淆了事情。
/后记
LEFT OUTER JOIN将尽可能返回与RIGHT表连接的LEFT表中的所有logging。
如果有匹配的话,它仍然会返回匹配的所有行,因此,在RIGHT中匹配两行的一行将返回两个ROWS,就像INNER JOIN一样。
编辑:为了响应你的编辑,我刚刚进一步看看你的查询,它看起来像你只是从左表返回数据。 因此,如果只需要来自LEFT表的数据,并且只需要为LEFT表中的每一行返回一行,则根本不需要执行JOIN,只需从LEFT表中直接执行SELECT操作即可。
Table1 Table2 _______ _________ 1 2 2 2 3 5 4 6 SELECT Table1.Id, Table2.Id FROM Table1 LEFT OUTER JOIN Table2 ON Table1.Id=Table2.Id
结果:
1,null 2,2 2,2 3,null 4,null
这不是不可能的。 左表中的logging数是它将返回的最小logging数。 如果右表有两个logging与左表中的一条logging相匹配,它将返回两条logging。
回应你的后记,这取决于你想要什么。
由于连接条件有多个匹配项,因此左表中的每一行都获得(可能)多行。 如果您希望您的总结果具有与查询左侧部分相同的行数,则需要确保您的连接条件导致1对1匹配。
另外,取决于你真正想要什么,你可以使用聚合函数(例如,如果你只是想从右边的一个string,你可以生成一个列左边的右侧结果的逗号分隔的string的列。
如果您只查看外连接的1或2列,则可以考虑使用标量子查询,因为您将得到1个结果。
左表中的每个logging将返回的次数与右表中的匹配logging相同 – 至less为1,但很可能大于1。
像INNER JOIN(普通连接)一样,LEFT OUTER JOIN将为左表中的每一行返回尽可能多的结果,而在右表中find许多匹配的结果。 因此,您可以得到很多结果 – 最多N x M,其中N是左表中的行数,M是右表中的行数。
在LEFT OUTER JOIN中总是保证结果的最小数量至less为N.
这是左右桌之间的一对多关系吗?
请注意,如果在包含左外连接的查询的“右侧”表上有一个where子句…如果在右侧没有满足where子句的logging,则“左侧'表不会出现在您的查询结果….
如果你只需要从右侧任何一行
SELECT SuspReason, SiteID FROM( SELECT SUSP.Susp_Visits.SuspReason, SUSP.Susp_Visits.SiteID, ROW_NUMBER() OVER(PARTITION BY SUSP.Susp_Visits.SiteID) AS rn FROM SUSP.Susp_Visits LEFT OUTER JOIN DATA.Dim_Member ON SUSP.Susp_Visits.MemID = DATA.Dim_Member.MembershipNum ) AS t WHERE rn=1
要不就
SELECT SUSP.Susp_Visits.SuspReason, SUSP.Susp_Visits.SiteID FROM SUSP.Susp_Visits WHERE EXISTS( SELECT DATA.Dim_Member WHERE SUSP.Susp_Visits.MemID = DATA.Dim_Member.MembershipNum )
看起来好像每个SUSP.Susp_Visits行的DATA.Dim_Member表中有多行。
如果Dim_Member中的多个(x)行与Susp_Visits中的单个行相关联,则结果集中将有x行。