Oracle/DM:LEFT OUTER JOIN排除數據(代替:not in)
為了使用 LEFT OUTER JOIN 來排除 表1 中那些 id 在 表2 中有匹配的記錄,我們可以按照以下步驟進行操作:
數據表:
表1(table1):
| id | name |
|---|---|
| 1 | 1 |
| 2 | 2 |
| 3 | 4 |
表2(table2):
| id |
|---|
| 1 |
| 2 |
目標:
我們希望排除 table1 中那些在 table2 中有匹配的 id,即排除 id = 1 和 id = 2 的記錄,最終返回的是 id = 3 的記錄。
SQL 查詢:
SELECT t1.id, t1.name
FROM table1 t1
LEFT OUTER JOIN table2 t2 ON t1.id = t2.id
WHERE t2.id IS NULL;
解釋:
1.LEFT OUTER JOIN:我們將 table1 和 table2 根據 id 進行左外連接。左外連接會返回 table1 中的所有記錄,并嘗試將 table2 中與之匹配的記錄關聯上。如果 table2 中沒有對應的 id,則該列的值為 NULL。
2.WHERE t2.id IS NULL:我們在 WHERE 子句中添加了一個條件,確保只返回 table1 中那些沒有在 table2 中找到匹配記錄的行。也就是說,table1 中的 id 必須沒有出現在 table2 中。
結果:
| id | name |
|---|---|
| 3 | 4 |
解釋:
3.id = 1 和 id = 2 在 table2 中找到了匹配的記錄,因此它們被排除在結果之外。
4.只有 id = 3 的記錄沒有在 table2 中找到匹配,因此它被保留在結果中。
總結:
通過 LEFT OUTER JOIN 和 WHERE t2.id IS NULL 的組合,我們可以排除 table1 中那些在 table2 中有匹配的記錄,最終得到不在 table2 中出現的 table1 的記錄。
和not in區別
實際上,使用 LEFT OUTER JOIN 和 WHERE t2.id IS NULL 這種查詢方式,效果上等同于使用 NOT IN 來排除 table2 中存在的 id。它們都能夠排除 table1 中那些在 table2 中有匹配記錄的行。
通過 NOT IN 來排除記錄
使用 NOT IN 進行同樣的查詢,可以改寫為:
SELECT id, name
FROM table1
WHERE id NOT IN (SELECT id FROM table2);
解釋:
1.NOT IN 子查詢:首先從 table2 中獲取所有的 id 值,然后在 table1 中排除那些 id 出現在 table2 中的記錄。
2.只有 table1 中那些不在 table2 中的 id 才會被返回。
結果:
| id | name |
|---|---|
| 3 | 4 |
為什么 LEFT OUTER JOIN 和 NOT IN 在這個場景下是等價的?
3.LEFT OUTER JOIN 和 WHERE t2.id IS NULL:
- LEFT OUTER JOIN 返回 table1 中的所有記錄,同時嘗試與 table2 中的 id 進行匹配。
- 對于沒有匹配的行(即 table2.id 為 NULL),我們通過 WHERE t2.id IS NULL 來過濾,只保留那些在 table2 中找不到匹配的記錄。
6.NOT IN:
- NOT IN 直接排除 table2 中的所有 id,返回 table1 中那些 id 不在 table2 中的記錄。
區別:
雖然它們在這個特定場景下是等價的,但 LEFT OUTER JOIN 和 NOT IN 在性能和處理空值(NULL)方面可能會有所不同。以下是一些關鍵的區別:
8.性能差異:
9.在某些情況下,NOT IN 可能會導致性能問題,尤其是當子查詢返回 NULL 值時,NOT IN 可能會產生意外的結果。在使用 NOT IN 時,如果 table2 中存在 NULL 值,查詢結果可能會不符合預期。
10.LEFT OUTER JOIN + WHERE t2.id IS NULL 通常可以更好地處理這種情況,并且對大型數據集的表現可能更穩定。
11.空值處理:
- 如果 table2.id 中包含 NULL 值,NOT IN 會導致整個查詢返回空結果,因為 NOT IN 在處理 NULL 時表現得比較特殊。
- LEFT OUTER JOIN 和 WHERE t2.id IS NULL 在遇到空值時更具容錯性。
總結:
- 在您的例子中,LEFT OUTER JOIN 和 NOT IN 可以實現相同的功能:排除 table1 中那些在 table2 中有匹配 id 的記錄。
- 然而,在實際應用中,選擇哪種方式可能會受到性能、可讀性、空值處理等因素的影響。如果數據集非常大或有 NULL 值,LEFT OUTER JOIN 可能是一個更可靠的選擇。
浙公網安備 33010602011771號