У меня две таблицы:
table_a
с полями item_id
, rank
и 50 другими полями.table_b
с полями item_id
и теми же 50 полями, что и table_a
Мне нужно написать запрос 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, оставив поле ранга пустым, а затем просто заменить поля нулевого ранга. Поле ранга никогда не бывает нулевым, но item_id может дублироваться, а table_a может иметь значения item_id, которых нет в table_b, и наоборот.
Я не уверен, что понимаю, зачем вам это нужно, но вы можете использовать jsonb функции:
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;
Я почти уверен, что понял. Предварительно определенный столбец 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
Вы должны записать все поля. Вы можете нажать
SELECT * FROM information_schema.columns WHERE table_schema = 'your_schema' AND table_name = 'your_table'
, чтобы получить этот список, и, возможно, даже добавить запятую в конец имен столбцов, возвращаемых из этого запроса, чтобы вы могли просто скопировать / вставить в свой клиент.