我有几个表格,其中包含我正在尝试加入的日期,以创建一个大型表格,其中数据按日期分组。
我现在正在通过LEFT JOIN来实现这一点来从我需要加入的表中生成的subselect(很多是同一个表,不同的查询位置,并且涉及SUM和COUNT所以我认为我有使用subselects)。我遇到的问题是,如果第一个表中没有其中一个日期,那么即使后续表中有与该日期连接的行,它也不会显示在表中。我是根据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)
有意义吗?可能不是..
答案 0 :(得分:1)
基本上有两种方法可以做到:
您可以使用FULL OUTER JOIN
全外联接
从概念上讲,完全外部联接结合了应用两者的效果 左右外连接。 FULL OUTER中记录的位置 如果表不匹配,则结果集将为每个表都设置NULL值 缺少匹配行的表的列。对于那些记录 匹配,将在结果集中生成一行(包含 从两个表填充的字段)。
...
某些数据库系统不支持完整外部联接功能 直接,但他们可以通过使用内部连接来模拟它 UNION ALL从左侧和右侧选择“单表行” 分别表。相同的示例如下所示:
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)
您可以制作主视图的其他方式,包含所有表格的所有不同键,以及所有表格的LEFT JOIN。
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的第二种方式,因为很多RDBMS都不支持FULL OUTER JOIN,并且因为很多支持它的人没有很好地优化它,所以Oracle的当前版本只是威胁到一个完整的外部加入作为引用中显示的等效查询,女巫对于表演非常有损。
答案 1 :(得分: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
解决方案通常是Alessandro提供的第二个解决方案(第一个版本非常繁琐)。一个警告。他的解决方案从数据中提取日期。有时您希望生成主列表,可能来自日历表,也可能是生成日期列表(具体取决于数据库)。
答案 2 :(得分:-1)
尝试使用OUTER JOIN从主表中获取所有记录,并仅匹配子/子表中的记录。
SELECT a.Col1, b.Col1 FROM a LEFT OUTER JOIN b ON a.Col2=b.Col2
有关联接的详细信息,请参阅Join (SQL)。