PostgreSQL-将表格追加到另一个表格并添加一个字段而不列出所有字段

时间:2018-10-25 19:11:49

标签: postgresql union psql

我有两个表:

  • table_a,其中包含字段item_idrank和其他50个字段。
  • table_b,其中包含字段item_id,以及与table_a相同的50个字段

我需要编写一个SELECT查询,将table_b的行添加到table_a,但将等级设置为特定值,比方说4。

目前,我有:

SELECT * FROM table_a
UNION
SELECT item_id, 4 rank, field_1, field_2, ...

如何在不写出所有字段且不使用INSERT查询的情况下将两个表连接在一起?

编辑:

我的想法是,以某种方式将table_b与table_a连接在一起,而rank字段保持为空,然后简单地替换空的rank字段。排名字段永远不会为空,但是item_id可以重复,并且table_a的item_id值可能不在table_b中,反之亦然。

2 个答案:

答案 0 :(得分:1)

我不确定我为什么会需要这个,但是可以使用jsonb functions:

select (jsonb_populate_record(null::table_a, row)).*
from (
    select to_jsonb(a) as row
    from table_a a
    union 
    select to_jsonb(b) || '{"rank": 4}'
    from table_b b
) s
order by item_id;

Working example in rextester.

答案 1 :(得分:0)

我很确定我已经掌握了。预定义的rank列可以通过加入其自身的子集而插入到table_b中,而只保留要插入的列的左列。

WITH
    _leftcols AS ( SELECT item_id, 4 rank FROM table_b ),
    _combined AS ( SELECT * FROM table_b JOIN _leftcols USING (item_id) )
SELECT * FROM _combined
UNION
SELECT * FROM table_a