【发布时间】:2021-06-28 16:07:03
【问题描述】:
我将生成这样的结果 假设我有这些记录
Salah 3
John 2
我会期待这个
Salah
Salah
Salah
John
John
【问题讨论】:
标签: sql-server tsql
我将生成这样的结果 假设我有这些记录
Salah 3
John 2
我会期待这个
Salah
Salah
Salah
John
John
【问题讨论】:
标签: sql-server tsql
如果您始终对 n 有 small 值,则一种方法是使用 rCTE:
WITH rCTE AS(
SELECT [Name],
N,
1 AS I
FROM dbo.YourTable
UNION ALL
SELECT [Name],
N,
I + 1
FROM rCTE
WHERE I < N)
SELECT [Name]
FROM rCTe
ORDER BY [Name] DESC;
如果您有更大的数字,请使用性能更高的 Tally。我在这里使用内联:
WITH N AS(
SELECT N
FROM (VALUES(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL))N(N)),
Tally AS(
SELECT --TOP (SELECT MAX(N) FROM dbo.YourTable) --Limits the number of rows, which could also provide a performance benefit if you only sometimes have large numbers
ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS I
FROM N N1, N N2, N N3) --1000 rows, add more cross joins for more rows
SELECT [Name]
FROM dbo.YourTable YT
JOIN Tally T ON YT.N >= T.I
ORDER BY YT.[Name] DESC;
【讨论】:
1 看起来很恶心,@Charlieface,NULL 怎么样?
拥有一个包含所有正整数(或至少与您实际需要的数量一样多)的永久表可以让您进行非常简单的查询,例如:
select
p.[Name]
from
@People p
inner join numbers on p.[Count] >= numbers.[Count]
order by
p.[Name]
;
但是,如果您不想要或不能拥有这样的表格,您可以使用类似 here 建议的方法来即时生成这样的列表,并像这样使用它:
declare @People table
(
[Name] varchar(15),
[Count] int
);
insert into @People
values
('Salah', 3),
('John', 2);
WITH x AS (SELECT n FROM (VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) v(n))
select
p.[Name]
from
@People p
inner join
(
SELECT [Count] = ROW_NUMBER() OVER (ORDER BY (SELECT NULL))
FROM x ones, x tens, x hundreds, x thousands
) numbers on p.[Count] >= numbers.[Count]
order by
p.[Name]
;
【讨论】: