2013-04-20 110 views
8

我正在使用SQL Server(我相信它是2005)。SQL Server:左连接导致行数少于左表

我有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个其中的每一天有每小时观测数据不同的位置这是正确的。

我想要左连接表A和表B 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' 
+3

可以显示你使用的完整查询 – PSR 2013-04-20 04:29:24

+0

@PSR - 我编辑了我原来的帖子,包括使用的原始查询。 – codingknob 2013-04-20 04:41:40

+0

重新措辞@LoztInSpace宝贵的评论:在JOIN之前添加约束(使用WHERE)到选择表。否则,这些约束作用于连接的结果输出(并且可以将行数减少到比原始表更少)。 – 2015-03-26 03:26:53

回答

17

试试这个:

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') 
+0

这个技巧。谢谢。我是SQL的新手,所以不知道在这种情况下where子句的位置会产生如此大的差异。我很好奇,尽管我原来的查询实际上是在做什么。如果没有意义,246行的结果是什么? – codingknob 2013-04-20 05:09:31

+2

因此,您的查询首先执行了左连接,然后再通过where子句筛选出结果。希望它是有道理的。如果没有,我可以详细说明。 – faisal 2013-04-20 05:17:01

+0

发生了什么事是我原来的查询返回'ONLY'那些行,其中a.ID = b.ID,这不符合'LEFT'加入的哲学。这很奇怪。但我会接受它并继续前进,因为您的解决方案是正确的,并解决了我的问题。谢谢。欣赏它。 – codingknob 2013-04-20 05:42:25