sql查询,带null的左连接

xyhw6mcr  于 2021-06-18  发布在  Mysql
关注(0)|答案(2)|浏览(363)

我正在尝试按公司和日期创建一个小时列表,即使公司没有该日期的数据。我试过加入一个日历表,对它的日期和公司进行分组,但没有效果。

SELECT cal.date, comp.name, comp.hours
FROM company AS comp
LEFT JOIN calendar AS cal ON cal.date=comp.date
GROUP BY cal.date, comp.name

我希望在公司没有该日期的工作时间时得到空输出,例如:

2018-01-01   Company A   100
2018-01-01   Company B   NULL
2018-01-02   Company A   NULL
2018-01-02   Company B   NULL
2018-01-03   Company A   100
2018-01-03   Company B   50

但它只返回可以找到数据的行,就像我使用了内部连接一样。任何帮助都将不胜感激。谢谢您!

9lowa7mx

9lowa7mx1#

你犯了3个错误,其中2个是相关的:
您交换了联接中表的顺序(易于修复)
您的查询没有反映您声明的意图(更难修复)
您正在使用 GROUP BY 当它是不必要的(在这种特殊情况下无关)
我会关注2。你接近你的目标,但不是全部。修复第一个和第三个错误,下面是您的问题:

SELECT cal.date, comp.name, comp.hours
FROM calendar AS cal
LEFT JOIN company AS comp ON cal.date=comp.date

它将执行以下操作:

For each cal_row in calendar:
    For each comp_row in company:
        If cal_row.date equals comp_row.date:
            Create output row and append to output
    If no rows created:
        Create output row, fill with NULLs, and append to output

所以您的查询保证每个日期至少有一个输出行。你要找的是每个日期,每个公司一个输出行。一种方法是创建一个中间表,然后左键连接到该表:

SELECT tbl.date, tbl.name, comp.hours
FROM (
    SELECT DISTINCT cal.date, comp.name
    FROM calendar AS cal
    CROSS JOIN company as comp
) AS tbl
LEFT JOIN LEFT JOIN company AS comp ON
    tbl.date = comp.date AND tbl.name= comp.name

http://sqlfiddle.com/#!2010年11月9日
这与您想要的输出相匹配。

ohfgkhjo

ohfgkhjo2#

您可以使用日历作为左表,这样您将获得所有日期

SELECT cal.date, comp.name, comp.hours
FROM calendar  AS cal  
LEFT JOIN company AS comp ON cal.date=comp.date

我没有找到任何聚合函数,所以我删除了groupby

相关问题