我有两个表:
table_a
,其中包含字段item_id
,rank
和其他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中,反之亦然。
答案 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;
答案 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