gpt4 book ai didi

mysql - SQL 查询,带有 NULL 的 LEFT JOIN

转载 作者:行者123 更新时间:2023-11-29 16:53:11 24 4
gpt4 key购买 nike

我正在尝试按公司和日期创建营业时间列表,即使公司没有该日期的数据。我尝试过左连接日历表并对其日期进行分组,然后对公司进行分组,但无济于事。

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

当公司没有该日期的营业时间时,我希望得到 NULL 输出,如下所示:

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

但它只返回可以找到数据的行,就像我使用了 INNER JOIN 一样。任何帮助,将不胜感激。谢谢你!

最佳答案

您犯了 3 个错误,其中 2 个相关错误:

  1. 您交换了联接中表的顺序(易于修复)
  2. 您的查询并未反射(reflect)您所声明的意图(更难修复)
  3. 您在不必要时使用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

因此您的查询保证每个日期至少有 1 个输出行。您正在寻找的是每个日期、每个公司 1 个输出行。实现此目的的一种方法是创建一个中间表,并左连接到该表:

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/#!9/517b4e/11/0

这符合您所需的输出。

关于mysql - SQL 查询,带有 NULL 的 LEFT JOIN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52706515/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com