我有以下兩個表:
顧客:
| 客戶ID | 部門編號 |
|---|---|
| 啊啊啊 | 1234 |
| bbbb | 3456 |
地位:
| 部門編號 | 客戶ID | 地位 |
|---|---|---|
| 1234 | 空值 | 銀 |
| 3456 | bbbb | 金子 |
| 1234 | bbbb | 金子 |
我想加入客戶的狀態,但如果它回傳 NULL 我想給客戶部門默認值。我的理想輸出如下:
| 客戶ID | 部門編號 | 地位 |
|---|---|---|
| 啊啊啊 | 1234 | 銀 |
| bbbb | 3456 | 金子 |
我嘗試進行兩次左連接,但出現記憶體使用錯誤。還有另一種有效的方法嗎?
uj5u.com熱心網友回復:
你可以做:
select c.*, coalesce(s.status, d.status) as status
from customers c
left join status d on d.department_id = c.department_id
and d.customer_id is null
left join status s on s.department_id = c.department_id
and s.customer_id = c.customer_id
uj5u.com熱心網友回復:
這可能有效:
SELECT *,
(
SELECT TOP 1 status
FROM status s
WHERE s.customer_id = c.customer_id
OR (c.customer_id IS NULL AND s.department_id = c.department_id)
ORDER BY CASE WHEN s.customer_id is NOT NULL THEN 0 ELSE 1 END
) as status
FROM customers c
關鍵是您使用的是哪種資料庫。如果是 MySql,您可能需要 LIMIT 1 而不是 TOP 1。對于 Oracle,您可以查看 ROWNUM 欄位。
uj5u.com熱心網友回復:
假設至少在 上總是有一個匹配項department_id,您需要一個INNER連接,并且FIRST_VALUE()視窗函式將選擇正確的status:
SELECT DISTINCT
c.customer_id,
c.department_id,
FIRST_VALUE(s.status) OVER (
PARTITION BY c.customer_id, c.department_id
ORDER BY CASE
WHEN s.customer_id = c.customer_id THEN 1
WHEN s.customer_id IS NULL THEN 2
ELSE 3
END
) status
FROM customers c INNER JOIN status s
ON s.department_id = c.department_id;
根據您使用的資料庫,代碼可能會被簡化。
請參閱演示。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/458884.html
上一篇:如何使用Stuff壓縮SQL行?
