Я думаю, что здесь хорошо работает рекурсивный CTE.В моем примере я создаю табличные переменные с некоторыми образцами данных, которые полезны только для демонстрации.Часть от DECLARE @RepeatedLevel = 3;
и далее - это сам запрос.
-- Sample table variables are purely for demonstration.
DECLARE @Customer TABLE
(
ID INT IDENTITY(1,1)
, Name VARCHAR(25)
)
DECLARE @Delivery TABLE
(
ID INT IDENTITY(1,1)
, CustomerID INT
, DeliveryDate DATE
);
INSERT INTO @Customer
VALUES ('Jeremy'), ('Chris'), ('Sachin'), ('AdaTheDev');
INSERT INTO @Delivery
VALUES (1, '20100602')
, (2, '20100726')
, (2, '20110103')
, (3, '20090401')
, (3, '20100214')
, (3, '20100726')
, (4, '20100713')
, (4, '20100719')
, (4, '20100813')
, (4, '20101028');
DECLARE @RepeatedLevel INT = 3;
WITH DeliverysRepeated AS
(
SELECT
Customer.Name
, Delivery.DeliveryDate
, 1 AS RecursionLevel
FROM @Customer Customer
INNER JOIN @Delivery Delivery
ON Delivery.CustomerID = Customer.ID
UNION ALL
SELECT
DeliverysRepeated.Name
, DeliverysRepeated.DeliveryDate
, DeliverysRepeated.RecursionLevel + 1 AS RecursionLevel
FROM DeliverysRepeated
WHERE DeliverysRepeated.RecursionLevel < @RepeatedLevel
)
SELECT
DeliverysRepeated.Name
, DeliverysRepeated.DeliveryDate
FROM DeliverysRepeated
ORDER BY Name, DeliveryDate DESC