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