[英]Joining two tables when there is a not matching record exist
我正在嘗試使用1條sql語句來產生所需的結果。 我有2個名為,訂單和客戶的表,並嘗試使用這樣的查詢
select a.*, b.customers_name
from order a, customers b
where a.customers_id=b.customers_id
order by b.customers_name;
我的問題是訂單表中有一個偽造的customer_id,如果customers_id = 0,則customers_name =“內部”,該用戶在客戶表中不存在。 在加入這家公司之前,這種方式已經被使用過,所以我根本無法修改表格。
有沒有辦法顯示結果? 帶有“ customers_name”的訂單表中的所有訂單,如果“ customers_id = 0”(<=“ customers表中沒有匹配記錄”),則“ customers_name ='In House')和輸出應該由customers_name進行訂購。
select a.*,
COALESCE(b.customers_name, 'In House') as customers_name
from
order a LEFT JOIN customers b ON a.customers_id=b.customers_id
order by
customers_name;
要么
select a.*,
CASE
WHEN a.customers_id = 0 THEN 'In House'
WHEN b.customers_name IS NULL THEN 'Unknown'
ELSE b.customers_name
END as customers_name
from
order a LEFT JOIN customers b ON a.customers_id=b.customers_id
order by
customers_name;
無論哪種方式,都可以使用顯式JOIN來保持清晰。
第一個為所有丟失的客戶添加“內部”,第二個通過在customerid不為0時添加“未知”來處理丟失的客戶
您應該可以為此使用LEFT JOIN 。
select a.*, b.customers_name
from order a
left join customers b
on a.customers_id = b.customers_id
order by b.customers_name;
select a.*, IFNULL(b.customers_name, 'In House')
from order a
LEFT JOIN customers b ON a.customers_id=b.customers_id
order by b.customers_name;
嘿,我們在這里都得到了相同的答案...
一種選擇:
select a.*, case when a.customers_id=0 then 'In House' else b.customers_name end as customers_name
from order a
left join customers b on b.customers_id=a.customers_id;
順便說一句,我建議您使用“ join”語法。 將您的加入條件放在“ where”子句中,閱讀起來要容易得多。
這種方法使用UNION
在查詢過程中添加“ customer 0”行,然后執行INNER JOIN
。 僅當LEFT JOIN
不起作用時才使用它。 您的order
表顯然與customers
沒有外鍵關系(否則您將無法擁有customer_id
為0
),因此LEFT JOIN
可能會撿到一些垃圾; 您必須要對此做出判斷。
select a.*, b.customers_name
from order a
INNER JOIN (
SELECT customers_id, customers_name
FROM customers
UNION SELECT 0, 'In House') b ON a.customers_id=b.customers_id
order by b.customers_name;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.