SQL JOIN从左表中获取数据即使所有右列都匹配也是如此

时间:2016-08-09 11:19:06

标签: sql postgresql-9.5

我正在使用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,但结果是一致的任何想法怎么做。

2 个答案:

答案 0 :(得分:0)

join组合来自两个表的匹配行。由于employee表中的日期与日期表中的日期匹配两次,在语句之间给出的范围内,这就是输出中两行的原因。我想如果你使用任何连接,它将在输出中给出两行。

答案 1 :(得分:0)

它的架构问题,而不是JOIN声明......

您的表日历中包含主键列@echo off cd \. cd \Users\ dir *20** echo Users to be deleted pause @echo on for /D %%f in (*20**) do rmdir %%f /s /q pause exit ,但您尝试按列日加入,这不是唯一的。 Day = 23(每年12个,确切地说)有很多记录。所以,你的桌子每个月会得到1行。

要解决此问题,您应该按列Day_Id(或一次按3列:年+月+日)加入。