当前位置: 首页 > 知识库问答 >
问题:

左键在日期上加入所有日期

皇甫雨华
2023-03-14

我有几个带有日期的表,我正试图加入这些表来制作一个大表,其中数据按日期分组。

我现在通过左键联接来完成这个任务,从我需要联接的表中生成子选择(其中许多是同一个表,具有不同的查询位置,涉及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) 

有意义吗?可能没有...

共有3个答案

龙俊良
2023-03-14

您还有另一个选择,那就是根本不使用连接。您可以使用联合和聚合将结果聚集在一起:

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 

解决方案通常是亚历山德罗给出的第二个(第一个版本非常麻烦)。一个警告。他的解决方案从数据中提取日期。有时你想生成主列表,也许是从日历表中,或者通过生成日期列表(具体细节完全取决于数据库)。

刘瑞
2023-03-14

尝试使用OUTER JOIN从主表获取所有记录,仅从子/子表获取匹配的记录。

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

有关联接的详细信息,请参阅联接(SQL)。

邵博艺
2023-03-14

基本上有两种方法:

您可以使用完整的外部连接

完全外接

从概念上讲,完全外部联接结合了应用左外部联接和右外部联接的效果。如果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)

其他方法,你可以做一个主视图,女巫包含所有表的所有不同的键,左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)

有时,我更喜欢第二种方式,而不是完全外部连接,因为许多RDBMS不支持完全外部连接,而且许多支持它的人没有很好地优化它,例如Oracle的当前版本只是威胁完全外部连接,正如引用中所示的等效查询,它的性能非常低。

 类似资料:
  • 问题内容: 我有这个PHP代码: 我用它来获取当前日期,而我需要未来5年的日期,例如: 我怎样才能做到这一点? 问题答案: 尝试:

  • 问题内容: 我有一个日期,以及如何使所有日期都落在给定日期所属的一周的Java中? 有人可以帮我这个吗。 我正在尝试获取给定日期的星期日期,我已经解释了为什么这个问题不是重复的,请在评论前阅读。 问题答案: 您可以尝试以下方式, 输出值

  • 问题内容: 我正在使用PHPMyadmin,并使用PHP将值放入数据库中。我使用时间戳存储产品的到期日期,如下所示,例如: 我要选择所有到期日期等于今天的日期加上8天的日期(例如上面的那一天) 我也想在一个单独的页面中选择所有过期日期等于今天日期+ 2周的内容,如果有人可以帮助我,将不胜感激! 问题答案: 您可以使用以下查询来做到这一点: 您可以使用过去的日期。

  • insertDate(int $row, int $column, int $timestamp[, string $dateFormat = 'yyyy-mm-dd hh:mm:ss', resource $formatHandler]) int $row $excel = new \Vtiful\Kernel\Excel($config); ​ $dateFile = $excel->fil

  • 我正在使用airbnb的反应日期库的日期选择器。然而,它现在工作,同时使用它与redux形式。当我点击选择日期按钮,日历弹出。选择日期时,输入框显示为空,而不是选择的日期。 我的问题是输入框上没有显示所选日期。 这是我的密码 如何在输入框上显示所选日期,同时保留所选日期?

  • 我知道如何在PHP中将数据添加到URL,但现在这是使用Fluid的TYPO3。我现在需要在URL中添加日期,如 但我如何在TYPO3流体中实现这一点? 添加/编辑2014年5月19日。。 我试图使用时间作为预订ID。 好的,我有文件夹/www/typo3conf/ext/powermail/Classes/ViewHelpers 在该文件夹中,我有一个名为BookIdViewHelper的文件。p