Использование подзапросов (общее табличное выражение) в качестве фильтров - PullRequest
0 голосов
/ 27 ноября 2018

tl; dr: Мои условия фильтрации значительно различаются в зависимости от даты доставки сегодня и вчера.Как можно использовать подзапросы, чтобы упростить мой код?


Я учу себя SQL и довольно хорошо разбираюсь в большинстве концепций, за исключением подзапросов.Обычно я понимаю, что могу использовать WITH ___ AS перед запросом, чтобы возвращать результаты, соответствующие условиям, указанным в подзапросе.Я думал, что смогу заставить его работать с более чем одним подзапросом, но у меня проблемы.Он работает с одним подзапросом, но не с несколькими.Я знаю, что это можно сделать с помощью оператора WHERE, но это будет довольно сложно.Вот пример того, что я хотел бы сделать:

WITH todays_results AS(
SELECT
order_id,
status,
message
FROM delivery_statuses
WHERE delivery date = STRLEFT(CAST(now() AS string,10)
AND (status = 'delivered'
OR (status = 'out for delivery' AND message = 'On vehicle for delivery')
OR (status = 'in transit' AND message <>'At sort center')
),

yesterdays_results AS (
SELECT
order_id,
status,
message
FROM delivery_statuses
WHERE delivery date = STRLEFT(CAST(now() - INTERVAL 1 days AS string,10)
AND (status = 'delivered'
OR (status = 'out for delivery' AND message = 'Shipment will be delivered within 1 hour')
OR (status = 'pre transit' AND message <>  'Order processing')
)

SELECT
*

FROM customer_details cd
INNER JOIN
(SELECT * FROM todays_results) tr
ON cd.order_id = tr.order_id
INNER JOIN
(SELECT * FROM yesterdays_results) yr
ON cd.order_id = yr.order_id

Как я могу сделать так, чтобы это возвращало результаты, которые соответствуют первому подзапросу, а под результатами - второй подзапрос?Я хотел бы даже добавить третий подзапрос.

1 Ответ

0 голосов
/ 27 ноября 2018

Дайте каждому с пунктом число, чтобы идентифицировать его.Затем вы можете объединить все объединения и упорядочить результаты по общему столбцу id .

-- this code has not been tested.
WITH 
A AS
(
    SELECT 1 ID, OTHER_STUFF FROM SOME_WHERE
),
B AS
(
    SELECT 2 ID, OTHER_STUFF FROM SOME_WHERE_ELSE
)
SELECT *
FROM
(
    SELECT A.ID, C.*
    FROM TABLEX C
    JOIN A
      ON A.KEY = C.KEY

    UNION ALL

    SELECT B.ID, D.*
    FROM TABLEX D
    JOIN B
      ON B.KEY = D.KEY
) 
ORDER BY ID
...