C# 返回T-SQL中的重复行

C# 返回T-SQL中的重复行,c#,sql,sql-server,tsql,C#,Sql,Sql Server,Tsql,我目前正在编写一条SQL语句,将客户交付的详细信息输出到一个漂亮的repeater网格中。但是,基于customers表中的一个字段,该字段包含一个整数,用于确定有多少行,我需要能够生成具有完全相同细节的那么多行 例如:一个交付有一行,但是根据该客户的customers表中的数字,同一行需要在SQL中输出多次 有什么想法吗?抱歉,如果这有点混乱,我知道这听起来很愚蠢,但是从SQL中可以看出,正在为该交付生成“标签”,并且可能需要多个标签 这里有一种方法,利用一个数字表,您可以一次性创建并填充从1

我目前正在编写一条SQL语句,将客户交付的详细信息输出到一个漂亮的repeater网格中。但是,基于customers表中的一个字段,该字段包含一个整数,用于确定有多少行,我需要能够生成具有完全相同细节的那么多行

例如:一个交付有一行,但是根据该客户的customers表中的数字,同一行需要在SQL中输出多次


有什么想法吗?抱歉,如果这有点混乱,我知道这听起来很愚蠢,但是从SQL中可以看出,正在为该交付生成“标签”,并且可能需要多个标签

这里有一种方法,利用一个数字表,您可以一次性创建并填充从1到n的数字

SELECT d.*
FROM Delivery d
    JOIN Customer c ON d.CustomerID = c.ID
    JOIN @Numbers n ON c.NumberField >= n.Num
e、 g.基本例子

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
更新 如果不想创建物理数字表,则可以为数字1-2048使用如下spt_值:

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'

阿达德夫的延伸回答。使用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)

我认为在这里工作得很好的是递归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

你能从不同的表中引用一些示例记录吗?客户和交付,并显示一些示例所需的输出?谢谢,这似乎是一个好主意-但目前我希望尽可能避免修改数据库,但这肯定是我将与我的经理讨论的一个问题。这是CTEs递归使用的一个极好的例子。你经常看到有人提到它,但我已经看到它被很好或很清楚地说明了。不过我很好奇,递归CTE的性能如何?这里有一篇关于2007年CTE性能的文章。谢谢你的链接。所以这听起来像是一个你想要远离的功能,除非绝对必要。还是很酷。啊,我发帖子的时候读过艾达的答案,但没有读过米凯尔·埃里克森的。他们的答案基本上是相同的:使用递归CTE和一个更一般的例子,比我早几个小时。我将把这个答案留作另一个例子,但我想指出的是,他首先回答了这个问题^^