簡體   English   中英

SQL JOIN從左表獲取數據,即使所有右列都匹配

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM