我有兩個服務提供商表providers
和providers_clean
。 providers
包含數以千計的提供者格式非常差的數據,providers_clean
只有少數提供者仍然存在於'髒'表中。從兩個表中選擇行並排除這兩個表中存在的主鍵
我希望系統使用這些數據在用戶'清理'數據時保持正常運行,所以我希望能夠選擇所有已經'清理'的行和那些行仍然是「髒」,同時排除與「乾淨」相同的「髒」結果。
我如何可以選擇所有供應商從providers_clean
表全部由providers
表中的供應商合併,排除已經被「清理」的那些
我已經試過:
SELECT * FROM providers WHERE NOT EXISTS (SELECT * FROM providers_clean WHERE providers_clean.id = providers.id)
這給我所有來自providers
的'髒'結果不包括'乾淨'的結果,但我怎樣才能重寫查詢以合併所有'乾淨'的結果從providers_clean
?
這裏是我想要做的可視化表示:
Clean Table
+----+-------------------+
| ID | Name |
+----+-------------------+
| 1 | Clean Provider 1 |
| 4 | Clean Provider 4 |
| 5 | Clean Provider 5 |
+----+-------------------+
Dirty Table
+----+------------------+
| ID | Name |
+----+------------------+
| 1 | Dirty Provider 1 |
| 2 | Dirty Provider 2 |
| 3 | Dirty Provider 3 |
| 4 | Dirty Provider 4 |
| 5 | Dirty Provider 5 |
+----+------------------+
Desired Result
+----+------------------+
| ID | Name |
+----+------------------+
| 1 | Clean Provider 1 |
| 2 | Dirty Provider 2 |
| 3 | Dirty Provider 3 |
| 4 | Clean Provider 4 |
| 5 | Clean Provider 5 |
+----+------------------+
感謝
UPDATE
這是工作,但是,有沒有寫一個更有效的方法這個查詢?
SELECT providers.id AS id,
CASE
WHEN
providers_clean.id IS NOT NULL
THEN
providers_clean.provider_name
ELSE
providers.provider_name
END AS pname,
CASE
WHEN
providers_clean.id IS NOT NULL
THEN
providers_clean.phone
ELSE
providers.phone
END AS pphone,
CASE
WHEN
providers_clean.id IS NOT NULL
THEN
providers_clean.website
ELSE
providers.website
END AS pwebsite
FROM providers
LEFT JOIN providers_clean ON providers_clean.id = providers.id
ORDER BY providers.id asc
這是我的查詢基本上一樣。 'COALESCE'提供更簡潔的語法來代替'CASE'表達式。我懷疑它可以比這更有效率:它只是一個簡單的'LEFT JOIN'操作。 –
但我不想爲ID以外的任何字段使用'COALESCE'。換句話說,即使在'clean'表中名稱,電話,網站都是'NULL',我希望結果爲NULL,而不是'dirty'表上的值。那是我遇到問題的地方。 – WheatBeak
好吧,我現在看到.... –