2012-07-22 64 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 

的解决方案通常是由亚历山德罗(第一个版本是非常麻烦)给出的第二个。一个警告。他的解决方案从数据中提取日期。有时候,您想要生成主列表,可能是从日历表中生成的,也可能是生成日期列表(具体取决于数据库)。