我正在寻找一个查询来获得以下输出:
Id Number
-- ------
1 241100
2 241110
2 241111
2 241112
2 241113
2 241114
2 241115
表结构:
Id Number From To
-- ------ ---- ----
1 241100 NULL NULL
2 241110 111 115
没有从/到范围的行必须返回数字。其他的必须返回数字后跟
SUBSTRING(Number, 1, 3) + <from/to range>
一种可能的解决方案是使用 while 循环。但这不是我喜欢的方式。而且速度很慢。并且没有办法改变数据结构。我们从第三方供应商处查询数据。
在应用程序站点上,我有一个(非常小的)数字列表,例如“241113”、“241000”……并且需要知道该数字分配给哪个 ID。
我将用来获取结果的查询是:
SELECT Id, Number FROM MyView WHERE Number IN ('241113', '241000')
最佳答案
您可以 create an auxiliary numbers table
CREATE TABLE Numbers
(
N int primary key
)
WITH E00(N) AS (SELECT 1 UNION ALL SELECT 1),
E02(N) AS (SELECT 1 FROM E00 a, E00 b),
E04(N) AS (SELECT 1 FROM E02 a, E02 b),
E08(N) AS (SELECT 1 FROM E04 a, E04 b),
E16(N) AS (SELECT 1 FROM E08 a, E08 b),
E32(N) AS (SELECT 1 FROM E16 a, E16 b),
cteTally(N) AS (SELECT ROW_NUMBER() OVER (ORDER BY N) FROM E32)
INSERT INTO Numbers
SELECT N FROM cteTally
WHERE N <= 1000000;
然后生成您想要的结果
;WITH T (Id, Number, [From], [To]) AS
(
SELECT 1, 241100, NULL, NULL UNION ALL
SELECT 2, 241110, 111, 115
)
SELECT Id, Number + N-1 AS Number
FROM T
JOIN Numbers ON N <= 1 + ISNULL(1 + [To] - [From],0)
关于sql - (递归)SQL 查询而不是循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7333609/