我有這個資料庫
CREATE TABLE user_auth_custom (
id serial,
name VARCHAR ( 255 )
);
CREATE TABLE payment_action (
id serial,
user_auth_custom_id integer,
message VARCHAR ( 255 )
);
CREATE TABLE work_action (
id serial,
user_auth_custom_id integer,
message VARCHAR ( 255 )
);
INSERT INTO user_auth_custom VALUES
(1, 'borris'),
(2, 'jeremy'),
(3, 'joe'),
(4, 'barry');
INSERT INTO payment_action VALUES
(1, 1, 'Paid $20'),
(2, 1, 'Paid $340'),
(3, 1, 'Paid $12'),
(4, 2, 'Paid $120');
INSERT INTO work_action VALUES
(1, 1, 'Submitted work abc'),
(2, 1, 'did stuff'),
(3, 1, 'more things'),
(4, 1, 'loafing about'),
(5, 1, 'dancing'),
(6, 1, 'push ups'),
(7, 1, 'monwalk'),
(8, 2, 'balanced books'),
(9, 2, 'read mind');
用戶 1 (borris) 有 3 個付款動作和 7 個作業動作。
我想以這種格式回傳 10 個結果:
| 用戶身份 | 資訊 | 動作型別 |
|---|---|---|
| 1 | 付了 20 美元 | 支付 |
| 1 | 做了什么 | 作業 |
ETC...
我的想法是將付款和作業表都留在客戶記錄中。我認為這會產生 10 條作業或付款欄位為空的記錄。然后我可以 nullcheck/coalesce 得到結果。像這樣的東西:
select u.id user_id, COALESCE (wa.message, pa.message, '') message,
case
when pa.id is not null then 'Payment'
when wa.id is not null then 'Work'
end action_type
from user_auth_custom u
LEFT JOIN work_action wa ON u.id = wa.user_auth_custom_id
LEFT JOIN payment_action pa ON u.id = pa.user_auth_custom_id
where (pa.id != null or wa.id != null)
and.id = 1
但它的行為不像我想象的那樣。
以我需要的格式獲取資料的正確方法是什么?
uj5u.com熱心網友回復:
如果我理解正確,您可以嘗試使用UNION ALL子查詢而不是OUTER JOIN
SELECT t1.*
FROM user_auth_custom u
LEFT JOIN
(
SELECT user_auth_custom_id UserId,message,'Payment' ActionType
FROM payment_action
UNION ALL
SELECT user_auth_custom_id UserId,message,'Work'
FROM work_action
) t1
ON u.id = t1.UserId
WHERE u.id = 1
但是如果你不需要從中獲取列或過濾資料user_auth_custom,我們可以UNION ALL直接使用子查詢
SELECT t1.*
FROM
(
SELECT user_auth_custom_id UserId,message,'Payment' ActionType
FROM payment_action
UNION ALL
SELECT user_auth_custom_id UserId,message,'Work'
FROM work_action
) t1
WHERE UserId = 1
sqlfiddle
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/468896.html
標籤:sql PostgreSQL
上一篇:插件“AspectJweaver”無法初始化“java.lang.NoClassDefFoundError:com/intellij/openapi/compiler/ClassInstrumenti
