![](/img/trans.png)
[英]In an SQL join operation, how to get the rows from the left join and only the aggregate of two columns from the right table
[英]SQL JOIN get data from left table Only even if all right column match
我正在使用PostgreSQL 9.5。 我有拖车桌
EmployeeReportMarch
EmployeeId Bonus Day
---------------------------------
1 10000 23
EmployeeReport20152016
EmployeeId Bonus Month
---------------------------------
1 10000 02
1 10000 03
EmployeeReport
EmployeeId Bonus FiscalYear
---------------------------------
1 100000 20152016
1 90000 20162017
Calendar
Day_Id Day Month FiscalYear
--------------------------------------------
2015-03-21 21 3 20152016
2015-03-22 22 3 20152016
2015-03-23 23 3 20152016
2015-03-24 24 3 20152016
2015-03-25 25 3 20152016
日历表从'2010-01-01'到'2016-12-31'。 会计年度为4月1日至3月31日。
当我加入两个表以从中获取数据时
SELECT e.EmployeeeId, e.Bonus
FROM Employee e INNER JOIN Calendar c ON e.Day = c.Day
WHERE c.Day_Id BETWEEN '2015-02-01'::Date AND '2015-03-31'::Date;
输出:
EmployeeId Bonus Day_Id
-------------------------------------
1 10000 2015-02-23
1 10000 2015-03-23
SELECT e.EmployeeeId, e.Bonus
FROM Employee e INNER JOIN Calendar c ON e.Month = c.Month
WHERE c.Day_Id BETWEEN '2015-02-01'::Date AND '2015-03-31'::Date;
输出:
EmployeeId Bonus
--------------------
1 100000
1 100000
--59 Rows (2 Month rows)
SELECT e.EmployeeeId, e.Bonus
FROM Employee e INNER JOIN Calendar c ON e.FiscalYear = c.FiscalYear
WHERE c.Day_Id BETWEEN '2015-02-01'::Date AND '2015-03-31'::Date;
输出:
EmployeeId Bonus
--------------------
1 10000
1 10000
--365 Rows
但是表中只剩下一个记录。 我也尝试过OUTER JOIN,但结果却是相同的,怎么做。
join合并两个表中的匹配行。 由于雇员表中的日期与日历表中的日期在两次语句之间给定的范围内匹配两次,因此这就是为什么输出两行。 我认为,如果您使用任何联接,它将在输出中提供两行。
这是架构问题,而不是JOIN语句...
您的表Calendar具有Primary Key列Day_Id
,但是您尝试按Day列进行联接,这不是唯一的。 有很多记录,其中Day = 23(准确地说,每年12个)。 因此,您每月在表中获得1行。
要解决此问题,您应该按Day_Id列(或同时按3列:Year + Month + Day)加入它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.