我正在使用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}}
答案 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 中选择所有行,这是错误的