2016-12-01 78 views
0

代码:SQL Server的双左连接数是不同的

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

+1

你有1:n映射? – Marvin

回答

1

在你的餐桌table3包含table1每排多则1排。检查两个表中出现更多次的值。

你可以使用group by和max函数做一对一的行。

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 1order by使用,但我不知道你想要哪一排。而且,这可能是一个阻挡差距;你应该弄清楚为什么有重复。

+0

谢谢。你说的重复QC是正确的。我正在处理的表格不应该有1:n映射,但看起来像他们一样。我想数据质量控制是为这些表排队! – ShruS