Рекурсивная помощь CTE - PullRequest
0 голосов
/ 06 ноября 2018

Я не эксперт по SQL и могу выполнять простые объединения и запросы Union, я пытаюсь создать отрывок Orders, которые связаны друг с другом. Я считаю, что могу использовать Рекурсивный CTE, чтобы получить требуемый экстракт.

Текущий процесс заключается в том, что если в заявку необходимо внести изменения, то исходная транзакция отменяется и создается новый заказ. Оба заказа имеют разные идентификаторы заказов, которые являются первичными ключами. Вы могли бы потенциально иметь сценарий, что заказ будет изменен х раз. «X» является полностью переменной.

Детали заказа содержатся в таблице A1. Order_ID является первичным ключом Порядок размещения заказов связан друг с другом в таблице A2. Order_ID - это новый заказ, Parent_Order_ID - это оригинальный заказ.

Пока у меня есть следующее

WITH DT_TEST AS(
    select * from 
    A1 inner join A1 on A1.Order_Id = b.Parent_Order_Id
)
SELECT * FROM DT_TEST

Я знаю, что мне нужно объединиться с Якорем, но не знаю, какой синтаксис мне нужен, если кто-то может указать мне правильное направление. Спасибо за вашу помощь.

1 Ответ

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

Мы можем сформулировать рекурсивный CTE в SQL Server как объединение базового запроса и рекурсивного запроса. Возможно, сложная часть находится в рекурсивном запросе, который состоит из соединения базовой таблицы с самим CTE. Обратите внимание, что условие соединения состоит в том, что данный Parent_Order_Id в базовой таблице соответствует некоторому Order_Id в предыдущем CTE.

WITH DT_TEST AS (
    -- base query
    SELECT Order_Id, Parent_Order_Id
    FROM A1
    WHERE Parent_Order_Id IS NULL
    UNION ALL 
    -- recursive query
    SELECT a.Order_Id, a.Parent_Order_Id
    FROM A1 a
    INNER JOIN DT_TEST b
        ON a.Parent_Order_Id = b.Order_Id
)

SELECT * FROM DT_TEST;
...