2012-07-22 59 views
2

我有幾個表的日期,我試圖加入到一個大型表中的數據按日期分組。左加入日期所有日期

我正在通過LEFT JOIN'ing完成此選擇,從我需要加入的表中生成(其中很多是不同的查詢並涉及SUM和COUNT的同一個表,因此我認爲我必須使用子選項)。我遇到的問題是,如果其中一個日期不存在於第一個表中,那麼即使在隨後的表中存在與該日期連接的行時,它也不會顯示在表中。我正在加入基於DATE(datetime_column)。

所以它就像

SELECT date, col 1 
FROM a 
    LEFT JOIN (SELECT date, col2 FROM a1) a2 ON DATE(a.date)=DATE(a2.date) 
    LEFT JOIN (SELECT date, col3 FROM a3) a4 ON DATE(a3.date)=DATE(a4.date) 

有意義嗎?可能不是..

回答

-1

嘗試使用OUTER JOIN從主表中獲取所有記錄,並僅匹配來自子/子表的記錄。

SELECT a.Col1, b.Col1 FROM a LEFT OUTER JOIN b ON a.Col2=b.Col2 

有關連接的詳情,請參閱Join (SQL)

+0

'LEFT JOIN'和'LEFT OUTER JOIN'是等價的。 – 2012-07-22 08:41:31

+0

是的,我承認我的錯誤。謝謝。 – Shant 2012-07-22 08:47:05

1

基本上有兩種方法可以做到這一點:

您可以使用FULL OUTER JOIN

全外連接

概念,完全外部聯接組合運用這兩種 的影響左外連接和右外連接。在FULL OUTER JOINed 表中的記錄不匹配的情況下,結果集對於缺少匹配行的表中的每個 列都將具有NULL值。對於 匹配的記錄,將在結果集中生成一行(包含從兩個表填充的 字段)。

...

一些數據庫系統不支持全外連接功能 直接,但他們可以模仿它通過使用內部的加入, 聯盟「單全部選定表格行「分別從左右 表中。同樣的例子可以顯示如下:

SELECT employee.LastName, employee.DepartmentID, department.DepartmentName, department.DepartmentID 
FROM employee 
INNER JOIN department ON employee.DepartmentID = department.DepartmentID 

UNION ALL 

SELECT employee.LastName, employee.DepartmentID, CAST(NULL AS VARCHAR(20)), CAST(NULL AS INTEGER) 
FROM employee 
WHERE NOT EXISTS (SELECT * FROM department WHERE employee.DepartmentID = department.DepartmentID) 

UNION ALL 

SELECT CAST(NULL AS VARCHAR(20)), CAST(NULL AS INTEGER), 
department.DepartmentName, department.DepartmentID 
FROM department 
WHERE NOT EXISTS (SELECT * FROM employee WHERE employee.DepartmentID = department.DepartmentID) 

其他-方法可以使一個主視圖,女巫包含所有表的所有不同的密鑰,以留下所有的表連接。

select * 
from (
     SELECT date 
     FROM a 
     union 
     SELECT date 
     FROM a1 
     union 
     SELECT date 
     FROM a3 
    ) 
    LEFT JOIN a using (date) 
    LEFT JOIN a1 using (date) 
    LEFT JOIN a3 using (date) 

有時我傾向於第二種方式向FULL OUTER JOIN因爲FULL OUTER JOIN不支持許多RDBMS因爲有許多人誰支持它不優化得很好,Oracle的當前版本的例子只是威脅一個完整的外連接,因爲在引用中顯示了等同的查詢,女巫對於演出非常有損耗。

0

你有另一種選擇,它根本沒有使用連接。您可以通過工會和聚合帶來的結果一起:

SELECT date, max(col1) as col1, max(col2) as col2, max(col3) as col3 
FROM ((select date, col1, NULL as col2, NULL as col3 from a1) union all 
     (SELECT date, NULL, col2, NULL FROM a2) union all 
     (SELECT date, NULL, NULL, col3 FROM a3) 
    ) t 
group by date 

的解決方案通常是由亞歷山德羅(第一個版本是非常麻煩)給出的第二個。一個警告。他的解決方案從數據中提取日期。有時候,您想要生成主列表,可能是從日曆表中生成的,也可能是生成日期列表(具體取決於數據庫)。