PostgreSQL - добавить одну таблицу в другую и добавить поле, не перечисляя все поля

У меня две таблицы:

  • 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, и наоборот.

Вы должны записать все поля. Вы можете нажать SELECT * FROM information_schema.columns WHERE table_schema = 'your_schema' AND table_name = 'your_table', чтобы получить этот список, и, возможно, даже добавить запятую в конец имен столбцов, возвращаемых из этого запроса, чтобы вы могли просто скопировать / вставить в свой клиент.

JNevill 25.10.2018 21:17
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
68
2

Ответы 2

Я не уверен, что понимаю, зачем вам это нужно, но вы можете использовать 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

Другие вопросы по теме