Возврат дублирующейся строки в T-SQL - PullRequest
2 голосов
/ 17 января 2011

В настоящее время я пишу SQL-оператор, который выводит детали доставки для клиента в красивую сетку ретранслятора.Однако, основываясь на поле в таблице клиентов (с целым числом, определяющим, сколько строк), мне нужно иметь возможность генерировать столько строк с одинаковыми деталями в них.

IE: у доставки есть одна строка, но на основе числа в таблице клиентов для этого клиента одну и ту же строку нужно выводить столько раз в SQL.

Есть идеи?Извините, если это немного сбивает с толку, и я знаю, что это звучит глупо, но из SQL генерируются «метки» для этой доставки, и может потребоваться несколько меток.

Ответы [ 3 ]

3 голосов
/ 17 января 2011

Расширенный ответ от AdaTheDev.Использование CTE для создания таблицы номеров.

with Numbers(Num)
as
(
    select 1 as Num
    union all
    select (Num + 1) as Num
    from Numbers
    where Num < 1000
)
select t1.*
from @T1 t1
    join @T2 t2 on t1.ID = t2.ID
    join Numbers n on t2.RowCnt >= n.Num option(maxrecursion 1000)
3 голосов
/ 17 января 2011

Вот один из способов, используя таблицу «Numbers», которую вы можете просто создать и заполнить числами от 1 до n (одноразовый процесс)

SELECT d.*
FROM Delivery d
    JOIN Customer c ON d.CustomerID = c.ID
    JOIN @Numbers n ON c.NumberField >= n.Num

например. базовый пример

DECLARE @T1 TABLE (ID INTEGER)
DECLARE @T2 TABLE (ID INTEGER, RowCnt INTEGER)
INSERT @T1 VALUES (1)
INSERT @T1 VALUES (2)
INSERT @T1 VALUES (3)
INSERT @T1 VALUES (4)
INSERT @T2 VALUES (1,1)
INSERT @T2 VALUES (2,2)
INSERT @T2 VALUES (3,4)

DECLARE @Numbers TABLE (Num INTEGER)
INSERT @Numbers VALUES(1)
INSERT @Numbers VALUES(2)
INSERT @Numbers VALUES(3)
INSERT @Numbers VALUES(4)
INSERT @Numbers VALUES(5)

SELECT t1.*
FROM @T1 t1
    JOIN @T2 t2 ON t1.ID = t2.ID
    JOIN @Numbers n ON t2.RowCnt >= n.Num

UPDATE
Если вы не хотите создавать таблицу физических чисел, вы можете (для чисел 1-2048) использовать spt_values, например:

SELECT t1.*
FROM @T1 t1
    JOIN @T2 t2 ON t1.ID = t2.ID
    JOIN spt_values n ON t2.RowCnt >= n.Num AND n.type='P'
0 голосов
/ 18 января 2011

Я думаю, что здесь хорошо работает рекурсивный 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...