База Hintsage

JOIN, подзапросы и CTE

Соединения, коррелированные подзапросы, производные таблицы, CTE и преобразование запросов.

Практика

Вопросы: JOIN, подзапросы и CTE

Для отчёта нужно сохранить клиентов без подходящих заказов. Определите, как размещение фильтра влияет на результат двух вариантов запроса, и объясните механизм.

WITH clients(id) AS (
    VALUES (1), (2)
), orders(client_id, status) AS (
    VALUES (1, 'paid'), (1, 'cancelled')
)
SELECT 'where' AS variant, c.id, o.status
FROM clients c
LEFT JOIN orders o ON o.client_id = c.id
WHERE o.status = 'paid'
UNION ALL
SELECT 'on', c.id, o.status
FROM clients c
LEFT JOIN orders o
       ON o.client_id = c.id
      AND o.status = 'paid';

В иерархии обнаружили циклическую ссылку. Какое поведение следует ожидать от этого рекурсивного CTE?

WITH RECURSIVE edges(child, parent) AS (
    VALUES (1, 2), (2, 1), (3, 2)
), ancestors(node) AS (
    SELECT 3
    UNION ALL
    SELECT e.parent
    FROM edges e
    JOIN ancestors a ON e.child = a.node
)
SELECT node
FROM ancestors;

В задаче сверки двух источников нужно сохранить строки, найденные только слева, только справа и в обоих источниках. Какой результат вернёт запрос и почему в нём появляются NULL?

WITH left_src(id, value) AS (
    VALUES (1, 'A'), (2, 'B')
), right_src(id, value) AS (
    VALUES (2, 'B2'), (3, 'C')
)
SELECT l.id AS left_id, l.value AS left_value,
       r.id AS right_id, r.value AS right_value
FROM left_src l
FULL OUTER JOIN right_src r ON r.id = l.id;
Программирование SQLJOIN, подзапросы и CTEРазработчик SQL и специалист по интеграции данных

Оптимизатор хочет протолкнуть фильтр внутрь производной таблицы с DISTINCT. Эквивалентны ли исходный и преобразованный запросы, и почему?

WITH rows(id, status) AS (
    VALUES (1, 'paid'), (1, 'cancelled'), (2, 'paid')
)
SELECT id, status
FROM (
    SELECT DISTINCT id, status
    FROM rows
) AS d
WHERE status = 'paid';

SELECT DISTINCT id, status
FROM rows
WHERE status = 'paid';

Показано 1–20 из 50