postgresql 在postgres中左下连接三个表

ecfsfe2w  于 2023-06-29  发布在  PostgreSQL
关注(0)|答案(1)|浏览(147)

假设我有表abc
我想以这样的方式离开加入他们
| 表B列|表c列| table_c_cols |
| - -----|- -----| ------------ |
| b1|零| null |
| b2|零| null |
| b3|零| null |
| b4|零| null |
| 零|C1| c1 |
| 零|C2| c2 |
| 零|C3| c3 |
| 零|碳四| c4 |
我知道我可以用union allleft join的组合来实现这一点,例如(伪代码)

select table_a_cols, table_b_cols, null as table_c_cols from a left join b
union all
select table_a_cols, null as table_b_cols, table_c_cols from a left join c

但是我想知道在postgresql中是否有更简洁的方法来做这件事(我需要为几个表做这件事)。

ewm0tg9j

ewm0tg9j1#

下面演示了使用UNION ALL生成原始帖子中描述的结果集的替代方法:

CREATE TABLE table_a (
  id integer PRIMARY KEY,
  tag text);

CREATE TABLE table_b (
  id integer PRIMARY KEY,
  a_id integer REFERENCES table_a(id),
  tag text);

CREATE TABLE table_c (
  id integer PRIMARY KEY,
  a_id integer REFERENCES table_a(id),
  tag text);

INSERT INTO table_a (id, tag)
VALUES (1, 'a1'), (2, 'a2');

INSERT INTO table_b (id, a_id, tag)
VALUES (1, 1, 'b1'), (2, 1, 'b2'), (3, 2, 'b3'), (4, 2, 'b4');

INSERT INTO table_c (id, a_id, tag)
VALUES (1, 1, 'c1'), (2, 1, 'c2'), (3, 2, 'c3'), (4, 2, 'c4');

SELECT a.tag AS table_a_cols, b.tag AS table_b_cols, c.tag AS table_c_cols
  FROM (VALUES ('b'), ('c')) s(selector)
  CROSS JOIN table_a a
  LEFT JOIN table_b b ON (s.selector = 'b' AND a.id = b.a_id)
  LEFT JOIN table_c c ON (s.selector = 'c' AND a.id = c.a_id)
ORDER BY b.tag, c.tag, a.tag;

这种方法比使用UNION ALL更简洁,并且可以很容易地扩展以包含其他表。

相关问题