我有兩張桌子:
一個
| WEEK_DATE | DAY_NUMBER |
|---|---|
| 2022 年 8 月 17 日 | 1 |
| 2022 年 8 月 18 日 | 2 |
| 2022 年 8 月 19 日 | 3 |
| 2022 年 8 月 22 日 | 4 |
| 2022 年 8 月 23 日 | 5 |
| 2022 年 8 月 24 日 | 6 |
| 2022 年 8 月 25 日 | 7 |
| 2022 年 8 月 26 日 | 8 |
| 2022 年 8 月 29 日 | 9 |
b
| 開始日期 | 結束日期 | 人 |
|---|---|---|
| 2022 年 8 月 17 日 | 2022 年 8 月 18 日 | 杰克 |
| 2022 年 8 月 23 日 | 2022 年 8 月 29 日 | 杰克 |
我正在嘗試確定 Jack 錯過的作業日,如下所示:
| 人 | WEEK_DATE | DAY_NUMBER |
|---|---|---|
| 杰克 | 2022 年 8 月 19 日 | 3 |
| 杰克 | 2022 年 8 月 22 日 | 4 |
現在,這是我的查詢和以下結果:
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
| 開始日期 | 結束日期 | 人 | WEEK_DATE | DAY_NUMBER |
|---|---|---|---|---|
| 2022 年 8 月 17 日 | 2022 年 8 月 18 日 | 杰克 | 2022 年 8 月 17 日 | 1 |
| 2022 年 8 月 17 日 | 2022 年 8 月 18 日 | 杰克 | 2022 年 8 月 18 日 | 2 |
| 2022 年 8 月 23 日 | 2022 年 8 月 29 日 | 杰克 | 2022 年 8 月 23 日 | 5 |
| 2022 年 8 月 23 日 | 2022 年 8 月 29 日 | 杰克 | 2022 年 8 月 24 日 | 6 |
| 2022 年 8 月 23 日 | 2022 年 8 月 29 日 | 杰克 | 2022 年 8 月 25 日 | 7 |
| 2022 年 8 月 23 日 | 2022 年 8 月 29 日 | 杰克 | 2022 年 8 月 26 日 | 8 |
| 2022 年 8 月 23 日 | 2022 年 8 月 29 日 | 杰克 | 2022 年 8 月 29 日 | 9 |
如前所示(第 3 天和第 4 天),如何讓 JOIN 包含 Jack 錯過的天數?即使是這樣的空值:
| 開始日期 | 結束日期 | 人 | WEEK_DATE | DAY_NUMBER |
|---|---|---|---|---|
| 2022 年 8 月 17 日 | 2022 年 8 月 18 日 | 杰克 | 2022 年 8 月 17 日 | 1 |
| 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 日 | 5 |
| 2022 年 8 月 23 日 | 2022 年 8 月 29 日 | 杰克 | 2022 年 8 月 24 日 | 6 |
| 2022 年 8 月 23 日 | 2022 年 8 月 29 日 | 杰克 | 2022 年 8 月 25 日 | 7 |
| 2022 年 8 月 23 日 | 2022 年 8 月 29 日 | 杰克 | 2022 年 8 月 26 日 | 8 |
| 2022 年 8 月 23 日 | 2022 年 8 月 29 日 | 杰克 | 2022 年 8 月 29 日 | 9 |
uj5u.com熱心網友回復:
你有兩個選擇,要么使用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 JOINs,所以它們是更容易理解的選項。
編輯添加一些進一步的解釋:
唯一一次您需要 aLEFT JOIN或RIGHT JOIN在這種情況下,您需要保存將被 a 過濾掉的行INNER 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 JOINs 作為標準,所以你最好交換表順序并使用左:
FROM table b
LEFT JOIN table a
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/517926.html
標籤:sql数据库2
