将 2 个用户操作表连接成一个结果

Joining 2 user action tables into a single result

我有这个数据库

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 '),
    (2, 1, 'Paid 0'),
    (3, 1, 'Paid '),
    (4, 2, 'Paid 0');
    
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 个工作操作。

我想要 return 10 个这种格式的结果:

User Id Message Action Type
1 Paid Payment
1 Did something Work

等...

我的想法是将付款和工作 table 加入客户记录。我认为这会产生 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

但它的表现并不像我想象的那样。

以我需要的格式获取数据的正确方法是什么?

如果我没理解错的话,你可以试试用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