SQL Server双左连接计数是不同的

时间:2016-12-01 22:30:09

标签: sql sql-server tsql sql-server-2012 left-join

代码:

Select a.x,
    a.y,
    b.p,
    c.i
    from table1 a left join table2 b on a.z=b.z
    left join table3 on a.z=c.z; 

当我使用上述代码时,我没有得到正确的计数:

  • 表1有30条记录。
  • 在第一次离开加入后,我获得了30条记录,但在第二次离开后,我得到了33条记录。

我很难弄清楚为什么我会得到不同的数字。根据我的理解,即使在第二次加入后我也应该得到30个计数。

任何人都可以帮我理解这种差异吗?

我正在使用sql server 2012

2 个答案:

答案 0 :(得分:2)

table3中有多个行具有相同的z值。

您可以通过以下方式找到它们:

select z, count(*)
from table3
group by z
having count(*) >= 2
order by count(*) desc;

如果您最多想要一个匹配,那么outer apply可能很有用:

Select a.x, a.y, b.p, c.i
from table1 a outer apply
     (select top 1 b.*
      from table2 b
      where a.z = b.z
     ) b outer apply
     (select top 1 c.*
      from table3 c
      where a.z = c.z
     ) c;

当然,top 1应与order by一起使用,但我不知道您想要哪一行。而且,这可能是一个止损;你应该弄清楚为什么会有重复。

答案 1 :(得分:1)

在您的表table3中,table1中每1行包含多于1行。检查两个表中出现的一个值。

您可以使用group by with max function来制作一对一的行。