While 循环问题:SQL 中的数学
While Loop Problems: Math in SQL
我编写了一个程序,将从 1 到给定数字的所有数字相加(输入 3 - 你得到 6,输入 4 你得到 10,等等)。我认为这是一段有趣的小代码,所以我想我会把它变成一个 while 循环(你启动循环,它输出所有内容直到特定数字。
问题:
我需要做什么才能将其变成 while 循环?
我有什么
CREATE Procedure MATH
@InNumber INT,
@OutNumber INT OUTPUT
AS
BEGIN
WHILE @InNumber <= 0
RETURN @OutNumber -1;
BEGIN
SET @OutNumber=((@InNumber)*(@InNumber+1))/2)
END
PRINT @OutNumber;
END
这不是一个合理的 SQL 设计 - 使用 tally table 代替:
with E1(N) AS (
select N from (values (1),(1),(1),(1),(1),(1),(1),(1),(1),(1) )E1(N)
), --10E+1 or 10 rows
E2(N) as (select 1 from E1 a cross join E1 b), --10E+2 or 100 rows
E4(N) as (select 1 from E2 a cross join E2 b), --10E+4 or 10,000 rows
E8(N) as (select 1 from E4 a cross join E4 b), --10E+8 or 100,000,000 rows
cteTally(N) as (
select top (@InNumber)
row_number() over (order by (select null))
from E8
)
select sum(N)
from cteTally;
Tally table 非常有用,以至于在大多数数据库中都有一个永久性的 Tally table 存在,其中包含许多行,可以处理该数据库的大多数应用程序。例如,在支持抵押贷款计算的数据库中,11,000 行足以处理 30 年抵押贷款的每天一行(30 * 366 = 10,980)。
然后使用一个名为 dbo.Tally 的永久计数 table 可用代码变得简单:
select sum(N)
from dbo.Tally
were N <= @InNumber;
在 SQL 中使用 WHILE 循环是一种可怕的代码味道。它们有时可能是必要的,但在 30 多年的编程生涯中,我不得不用一只手的手指数来数去的次数。
更新:
当然,正如上面的评论员所指出的,无论这种实现多么有效,只要已知存在,真正合理的设计都会使用封闭形式的公式(在本例中为高斯公式)。
我编写了一个程序,将从 1 到给定数字的所有数字相加(输入 3 - 你得到 6,输入 4 你得到 10,等等)。我认为这是一段有趣的小代码,所以我想我会把它变成一个 while 循环(你启动循环,它输出所有内容直到特定数字。
问题: 我需要做什么才能将其变成 while 循环?
我有什么
CREATE Procedure MATH
@InNumber INT,
@OutNumber INT OUTPUT
AS
BEGIN
WHILE @InNumber <= 0
RETURN @OutNumber -1;
BEGIN
SET @OutNumber=((@InNumber)*(@InNumber+1))/2)
END
PRINT @OutNumber;
END
这不是一个合理的 SQL 设计 - 使用 tally table 代替:
with E1(N) AS (
select N from (values (1),(1),(1),(1),(1),(1),(1),(1),(1),(1) )E1(N)
), --10E+1 or 10 rows
E2(N) as (select 1 from E1 a cross join E1 b), --10E+2 or 100 rows
E4(N) as (select 1 from E2 a cross join E2 b), --10E+4 or 10,000 rows
E8(N) as (select 1 from E4 a cross join E4 b), --10E+8 or 100,000,000 rows
cteTally(N) as (
select top (@InNumber)
row_number() over (order by (select null))
from E8
)
select sum(N)
from cteTally;
Tally table 非常有用,以至于在大多数数据库中都有一个永久性的 Tally table 存在,其中包含许多行,可以处理该数据库的大多数应用程序。例如,在支持抵押贷款计算的数据库中,11,000 行足以处理 30 年抵押贷款的每天一行(30 * 366 = 10,980)。
然后使用一个名为 dbo.Tally 的永久计数 table 可用代码变得简单:
select sum(N)
from dbo.Tally
were N <= @InNumber;
在 SQL 中使用 WHILE 循环是一种可怕的代码味道。它们有时可能是必要的,但在 30 多年的编程生涯中,我不得不用一只手的手指数来数去的次数。
更新:
当然,正如上面的评论员所指出的,无论这种实现多么有效,只要已知存在,真正合理的设计都会使用封闭形式的公式(在本例中为高斯公式)。