我有两张表:
一种
| 周日期|日期编号|
| - -|- -|
| 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日|九个|
1条答案
按热度按时间j8yoct9x1#
您有两种选择,一种是使用
RIGHT JOIN
:或者,交换您的表顺序:
我会推荐第二个选项,因为几乎每个人都在编写SQL时使用
LEFT JOIN
,所以它们是更容易理解的选项。只有在需要保留将被
INNER JOIN
过滤掉的行的情况下,您才会需要LEFT JOIN
或RIGHT JOIN
。如果你看一个基本的from/join:
顶部的表a是左表,底部的表b是右表。对于后面的联接,通常也是如此:
a桌在左边,b桌在右边。
因此,如果要保留表a中的行,则需要
LEFT JOIN
:如果您想保留表b中的行,那么我们返回到原始情况,您可以
RIGHT JOIN
:但同样,每个人都使用
LEFT JOIN
作为标准,所以最好交换表顺序并使用左: