17

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

我有TableA2 列和 439 行(每一行都是唯一的)。

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

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

+------------------------------------------------------------------------------+
|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返回所有行?TableATableB

*编辑*

我使用的完整查询是:

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

2 回答 2

32

试试这个:

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')
于 2013-04-20T04:50:36.093 回答
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 中选择所有行,这是错误的

于 2021-04-22T07:00:27.180 回答