Как в PostgreSQL сложить значения из двух разных таблиц?

Как объединить две таблицы в одну?
  • 12 апреля 2024 г. 14:09
Ответы на вопрос 2
Для сложения значений из двух разных таблиц в PostgreSQL можно использовать оператор UNION или UNION ALL.

Например, если у нас есть две таблицы table1 и table2 с одинаковой структурой, то запрос на сложение их значений будет выглядеть примерно так:

```sql
SELECT * FROM table1
UNION ALL
SELECT * FROM table2;
```

Для объединения двух таблиц в одну можно использовать оператор INSERT INTO. Например, если у нас есть две таблицы table1 и table2 и мы хотим объединить их в новую таблицу new_table, то запрос будет выглядеть примерно так:

```sql
INSERT INTO new_table
SELECT * FROM table1;

INSERT INTO new_table
SELECT * FROM table2;
```

При этом необходимо учитывать, что структура новой таблицы должна соответствовать структуре таблиц, которые объединяются.
Вывести на просмотр: 
SELECT p.price, od.quantity,
          p.price * od.quantity as cost -- в выборке можно не только поля выбирать, но и делать любые сложные матем. операции в пределах сопоставляемых строк и агрегированных функций
FROM products p
JOIN orderdetails od ON p.productid = od.productid --  ну, так соединяйте по ключам. Что мешает?
Where od.orderid = ? -- если нужно ограничиться в пределах заказа

Применить изменения:
update orderdetails
set orderdetails.totalcost = ( select p.price * orderdetails.quantity
                                                from products p
                                              where orderdetails.productid = p.productid
                                            ) -- вычисляем цену из таблицы продуктов и изменяем ее в деталях
where orderdetails.orderid = ? -- если нужно ограничиться в пределах заказа
and exists (select 1
                    from products p
                    where orderdetails.productid = p.productid
                  ) -- выбираем детали заказа только по тем продуктам, которые есть в продуктах, можно добавить доп. ограничения по затрагиваемым деталям

Можно навешать триггер на вставку, изменение таблицы orderdetails. Тогда при изменении количества, цена будет пересчитываться с помощью него автоматически.
Основа триггера:
update orderdetails
set orderdetails.totalcost = ( select p.price * new.quantity
                                                from products p
                                              where orderdetails.productid = p.productid
                                            ) -- вычисляем цену из таблицы продуктов и изменяем ее в деталях
where orderdetails.orderdetailid = new.orderdetailid

PS: Если это учебная база данных, то сойдет. А если реально используется такая модель, то не хватает таблицы "Цена продукта по состоянию на".
Похожие вопросы