Объединить таблицы - показать каждую строку левой таблицы только один раз и добавить строку с данными, которые не связаны с таблицей - PullRequest
0 голосов
/ 24 февраля 2019

У меня есть таблица, которая выглядит следующим образом:

продукты:

order_id  prices

_______  _____

2          20

3          11

null       40

Заказы:

id number

1      30

2      50

3      10

4      10

Я хочу получить следующую таблицу:

id      number  price

--      ------  -----


1       30      null

2       50      20

3       10      11

4       10      null

null(0) null(0) 40

внешний ключ, очевидно, является order_id -> orders.может быть нулевым.

Как вы, наверное, видите, я хочу включить все строки из табличных заказов, если есть ссылка на продукты, объединяющие их.и если нет ссылки, просто покажите ноль и «40» (сумма «отключенных» продуктов)

Может кто-нибудь помочь мне, пожалуйста?

Ответы [ 3 ]

0 голосов
/ 24 февраля 2019

Я думаю, что вы хотите full join:

select o.id o.number, p.price
from orders o full join
     products p
     on p.order_id = o.id;
0 голосов
/ 24 февраля 2019

Извлечение заказов

SELECT orders.id, orders.number
FROM orders;

 id | number 
----+--------
  1 |     30
  2 |     50
  3 |     10
  4 |     10

Извлечение цен, связанных с заказами

SELECT orders.id, orders.number, products.prices
FROM orders
LEFT JOIN products ON orders.id = products.order_id;

 id | number | prices 
----+--------+--------
  1 |     30 |        
  2 |     50 |     20 
  3 |     10 |     11 
  4 |     10 |        

Извлечение цен, связанных с заказами, а также с товарами без заказа

SELECT orders.id, orders.number, products.prices
FROM orders
FULL JOIN products ON orders.id = products.order_id;

 id | number | prices 
----+--------+--------
  1 |     30 |       
  2 |     50 |     20
  3 |     10 |     11
    |        |     40
  4 |     10 |       

Суммируйте цены без какого-либо заказа.Мы не видим здесь никакой разницы, поскольку существует только один продукт, с которым не связан ни один заказ (тот, где order_id равен нулю), но вы запросили сумму этих цен, так что вы идете: -)

SELECT orders.id, orders.number, SUM(products.prices) AS prices
FROM orders
FULL JOIN products ON orders.id = products.order_id
GROUP BY orders.id, orders.number;

 id | number | prices 
----+--------+--------
  1 |     30 |       
  2 |     50 |     20
  3 |     10 |     11
    |        |     40
  4 |     10 |       

Используйте нулевую (0) метку и заказывайте по номеру

SELECT
  coalesce(orders.id::varchar(255), 'null(0)') AS id,
  coalesce(orders.number::varchar(255), 'null(0)') AS number,
  SUM(products.prices) AS prices
FROM orders
FULL JOIN products ON orders.id = products.order_id
GROUP BY orders.id, orders.number
ORDER BY id;

   id    | number  | prices 
---------+---------+--------
 1       | 30      |       
 2       | 50      |     20
 3       | 10      |     11
 4       | 10      |       
 null(0) | null(0) |     40
0 голосов
/ 24 февраля 2019

Вам нужно left join от orders до products и union с products, которые имеют null как order_id:

select o.id, o.number, p.prices
from orders o left join products p
on p.order_id = o.id
union all
select null, null, p.prices
from products p
where p.order_id is null
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...