在我的sql脚本中,LEFT JOIN输出的结果如CROSS JOIN?

时间:2013-05-07 17:17:22

标签: sql sql-server tsql

我有两张表如下

DailyData

Date        Id  CompanyName CompanyPrice CompanyId
21-12-2011  123 ABC corp    120           535
25-12-2011  352 Z Edge      101           444
25-12-2011  352 Z Edge      100           444

primary key is `date` and `Id`

ReportData

RId Date        CompanyName TodayPrice CompanyId
1   25-12-2011  Z Edge      230           444

primary key is only `RId`

现在我在上面的表格中使用了以下LEFT JOIN,如:

Select a.date,a.companyname,a.CompanyPrice,b.TodayPrice 
from DailyData a LEFT JOIN ReportData b ON
a.companyid= b.companyid where a.Date = '25-12-2011'

但是,它不是两条记录,而是提供两条以上的记录(same records multiple times)

为什么会这样?

请帮我纠正我的SQL查询。

上述数据的预期输出应为:

date        companyname companyprice todaysprice
25-12-2011  Z Edge      101           230
25-12-2011  Z Edge      100           230

4 个答案:

答案 0 :(得分:2)

您当前的查询在实际列上缺少JOIN,因此您获得了满足日期条件的所有行的CROSS JOIN结果。您将需要使用:

Select a.date,a.companyname,a.CompanyPrice,b.TodayPrice 
from DailyData a 
LEFT JOIN ReportData b 
  ON a.CompanyId= b.CompanyId
WHERE a.Date = '25-12-2011';

请参阅SQL Fiddle with Demo

答案 1 :(得分:2)

您的加入条件:[ON a.Date = '25-12-2011']未在表b上建立任何条件,因此,表b中的每一行都连接到表a中具有该指定日期的每一行。

从查看这两个表格来看,它们是应该在日期还是在CompanyID上加入并不明显。

答案 2 :(得分:1)

我相信你需要像

这样的东西
Select a.date,a.companyname,a.CompanyPrice,b.TodayPrice 
from DailyData a 
LEFT JOIN ReportData b ON 
(b.CompanyId = a.CompanyId )
WHERE a.Date = '25-12-2011'

答案 3 :(得分:0)

sql fiddle

没有LEFT和没有WHERE子句

Select a.date,
  a.companyname,a.CompanyPrice,b.TodayPrice 
from DailyData a 
JOIN ReportData b 
  ON a.CompanyId= b.CompanyId