Как объединить внешние объединения в несколько таблиц в postgres? - PullRequest
0 голосов
/ 18 февраля 2020

Я хочу вернуть все заказы из базы данных между двумя указанными датами. Я хочу вернуть все заказы, даже если заказы не имеют указанных значений из соединенных таблиц (контакты, адреса и т. Д. c).

Когда я выполняю запрос 1, я вижу, что в результате у меня 39 заказов. Но когда я выполняю запрос 2 со своими объединениями, я возвращаю только 31 заказ. Я проверил базу данных, и это потому, что 8 заказов не имеют записей в объединенных таблицах.

Но я думал, что RIGHT OUTER JOIN вернет все значения из объединения, даже если в объединенной таблице есть значение NULL ?

Запрос 1

SELECT * FROM orders 
WHERE orders.created_at > '2020-02-01' AND orders.created_at < '2020-02-02'

Запрос 2

SELECT orders.id, orders.status, orders.created_at AS "Date-Time", orders.inbound_ticker, orders.inbound_sum, orders.outbound_ticker, orders.outbound_sum, orders.outbound_type,  
    CASE WHEN orders.inbound_type='Cryptocurrency' OR orders.outbound_type='Cryptocurrency' THEN 'Crypto' ELSE 'Fiat' END AS "tx type",
    customers.first_name AS "Customer First Name", customers.last_name AS "Customer Last Name", addresses.street, addresses.city, addresses.state, addresses.country, addresses.postal_code
    FROM orders
RIGHT OUTER JOIN customers ON orders.customer_id = customers.id
RIGHT OUTER JOIN contacts ON contacts.contactable_id = customers.id
RIGHT OUTER JOIN addresses ON customers.id = addresses.locatable_id
WHERE orders.created_at >= '2020-2-01' AND orders.created_at < '2020-2-02'
ORDER BY orders.created_at ASC;

1 Ответ

1 голос
/ 18 февраля 2020

Если вы хотите все заказы, начните с orders в предложении FROM и используйте LEFT JOIN:

FROM orders LEFT JOIN
     customers
     ON orders.customer_id = customers.id LEFT JOIN
     contacts
     ON contacts.contactable_id = customers.id LEFT JOIN
     addresses
     ON customers.id = addresses.locatable_id
WHERE orders.created_at >= '2020-02-01' AND
      orders.created_at < '2020-02-02'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...