SQL Server:左连接导致的行数少于左表中的行数

时间:2013-04-20 04:27:16

标签: sql sql-server left-join

我正在使用SQL Server(我相信它是2005年)。

我有TableA有2列和439行(每行是唯一的)。

+----------+
|ID | Name |
+----------+

我有TableB有35列和数十万行(每行也是唯一的)。

+------------------------------------------------------------------------------+
|Date | ID | Name | Blah1 | Blah2 | ... | Hour1 | Hour2 | Hour3 | ... | Hour24 |
+------------------------------------------------------------------------------+

TableB中的每一行都有每小时观察和其他一些管家信息。现在出于测试目的,我只对今天的日期感兴趣,即2013年4月19日。

如果我这样做:

Select count(*) 
from TableB 
where Date = '4/19/2013 12:00:00 AM'

我得到10526,这是正确的,因为有10526个不同的位置,每天有每小时的观察数据。

我想LEFT JOIN TableA和TableB on a.id = b.id,它应该产生一个有439行的结果。

不幸的是,结果有246行。怎么会这样? LEFT JOIN假设TableA是否返回TableB中的所有行,而不管select * from TableA as a left join TableB as b on a.id = b.id where RealDate = '4/20/2013 12:00:00 AM' 中是否匹配?

*的 修改 *

我使用的完整查询是:

{{1}}

2 个答案:

答案 0 :(得分:24)

试试这个:

select * from TableA as a
left join (SELECT * from TableB where RealDate = '4/20/2013 12:00:00 AM') as b
on a.id = b.id 

或者这个:

select * from TableA as a
left join TableB as b on (a.id = b.id AND RealDate = '4/20/2013 12:00:00 AM')

答案 1 :(得分:0)

看到其他答案,我的 2 美分(根据问题中的用例:我们要应用 ReadDateFilter 然后加入):

我们应该尝试遵循以下操作(我们称之为 query-1):

select * from TableA as a left join (SELECT * from TableB where RealDate = '4/20/2013 12:00:00 AM') as b on a.id = b.id

如果 RealDate 属于表 A :

(select * from TableA where RealDate = '4/20/2013 12:00:00 AM') as a left join (SELECT * from TableB ) as b on a.id = b.id

即应用过滤器然后加入

低于(查询 2):

select * from TableA as a left join TableB as b on (a.id = b.id AND RealDate = '4/20/2013 12:00:00 AM')

原因:如果 RealDate 属于 TableA query-2 实际上会从 TableA 中选择所有行,这是错误的