sql - (递归)SQL 查询而不是循环

标签 sql tsql

我正在寻找一个查询来获得以下输出:

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/

相关文章:

php - 使用 php 获取上次输入日期的总价格的 SQL 查询

mysql - 我的查询没有返回当月工作时间总和的最大值

sql-server - 当IDENTITY_INSERT设置为ON时,必须为表中的标识列指定显式值

sql - T-SQL : Using OVER and PARTITION BY

sql-server - 评估字符串列 SQL 中的逻辑表达式

mysql - 将 SQL 数据库导入实时服务器,表丢失

mysql - 获取最大的城市人口

tsql - 如何在 WHILE EXISTS() 循环中分配变量

java - 获取列的名称 (PostgreSQL)

sql - 对象名称包含的前缀数量超过最大数量。最大值为 3