db2 JOIN数据表的日期范围,但显示缺少的日期?

qvtsj1bj  于 2022-11-23  发布在  DB2
关注(0)|答案(1)|浏览(170)

我有两张表:
一种
| 周日期|日期编号|
| - -|- -|
| 2022年8月17日|一个|
| 2022年8月18日|2个|
| 2022年8月19日|三个|
| 2022年8月22日|四个|
| 2022年8月23日|五个|
| 2022年8月24日|六个|
| 2022年8月25日|七个|
| 2022年8月26日|八个|
| 2022年8月29日|九个|
B
| 开始日期|结束日期|人员|
| - -|- -|- -|
| 2022年8月17日|2022年8月18日|杰克|
| 2022年8月23日|2022年8月29日|杰克|
我尝试确定Jack错过的工作日,如下所示:
| 人员|周日期|日期编号|
| - -|- -|- -|
| 杰克|2022年8月19日|三个|
| 杰克|2022年8月22日|四个|
现在,这是我的查询和结果如下:

SELECT
    b.START_DATE,
    b.END_DATE,
    b.PERSON,
    a.WEEK_DATE,
    a.DAY_NUMBER
FROM b
LEFT JOIN a
    ON a.WEEK_DATE BETWEEN b.START_DATE AND b.END_DATE

| 开始日期|结束日期|人员|周日期|日期编号|
| - -|- -|- -|- -|- -|
| 2022年8月17日|2022年8月18日|杰克|2022年8月17日|一个|
| 2022年8月17日|2022年8月18日|杰克|2022年8月18日|2个|
| 2022年8月23日|2022年8月29日|杰克|2022年8月23日|五个|
| 2022年8月23日|2022年8月29日|杰克|2022年8月24日|六个|
| 2022年8月23日|2022年8月29日|杰克|2022年8月25日|七个|
| 2022年8月23日|2022年8月29日|杰克|2022年8月26日|八个|
| 2022年8月23日|2022年8月29日|杰克|2022年8月29日|九个|
我如何让JOIN包含前面所示的Jack错过的天数(第3天和第4天)?即使是像这样的空值:
| 开始日期|结束日期|人员|周日期|日期编号|
| - -|- -|- -|- -|- -|
| 2022年8月17日|2022年8月18日|杰克|2022年8月17日|一个|
| 2022年8月17日|2022年8月18日|杰克|2022年8月18日|2个|
| (空值)|(空值)|杰克|2022年8月19日|(空值)|
| (空值)|(空值)|杰克|2022年8月22日|(空值)|
| 2022年8月23日|2022年8月29日|杰克|2022年8月23日|五个|
| 2022年8月23日|2022年8月29日|杰克|2022年8月24日|六个|
| 2022年8月23日|2022年8月29日|杰克|2022年8月25日|七个|
| 2022年8月23日|2022年8月29日|杰克|2022年8月26日|八个|
| 2022年8月23日|2022年8月29日|杰克|2022年8月29日|九个|

j8yoct9x

j8yoct9x1#

您有两种选择,一种是使用RIGHT JOIN

SELECT
    b.START_DATE,
    b.END_DATE,
    b.PERSON,
    a.WEEK_DATE,
    a.DAY_NUMBER
FROM b
RIGHT JOIN a
    ON a.WEEK_DATE BETWEEN b.START_DATE AND b.END_DATE
--WHERE a.DAY_NUMBER IS NULL

或者,交换您的表顺序:

SELECT
    b.START_DATE,
    b.END_DATE,
    b.PERSON,
    a.WEEK_DATE,
    a.DAY_NUMBER
FROM a
LEFT JOIN b
    ON a.WEEK_DATE BETWEEN b.START_DATE AND b.END_DATE
--WHERE a.DAY_NUMBER IS NULL

我会推荐第二个选项,因为几乎每个人都在编写SQL时使用LEFT JOIN,所以它们是更容易理解的选项。

    • EDIT**添加一些进一步的说明:

只有在需要保留将被INNER JOIN过滤掉的行的情况下,您才会需要LEFT JOINRIGHT JOIN
如果你看一个基本的from/join:

FROM table a
JOIN table b

顶部的表a是左表,底部的表b是右表。对于后面的联接,通常也是如此:

JOIN table a ...
JOIN table b on a.id = b.id

a桌在左边,b桌在右边。
因此,如果要保留表a中的行,则需要LEFT JOIN

FROM table a
LEFT JOIN table b

如果您想保留表b中的行,那么我们返回到原始情况,您可以RIGHT JOIN

FROM table a
RIGHT JOIN table b

但同样,每个人都使用LEFT JOIN作为标准,所以最好交换表顺序并使用左:

FROM table b
LEFT JOIN table a

相关问题