【问题标题】:SQL WHILE LoopsSQL WHILE 循环
【发布时间】:2014-03-29 16:56:21
【问题描述】:

我一直致力于在 SQL 中创建嵌套的 while 循环,但遇到了 while 循环的问题。我认为主要问题在于我的外循环。有什么建议?

USE HW_DB;
IF OBJECT_ID('dbo.PythagoreanTriangles') IS NOT NULL
    DROP TABLE dbo.PythagoreanTriangles;
GO

CREATE TABLE PythagoreanTriangles
(
    Side1 INT NOT NULL,
    Side2 INT NOT NULL,
    Hypotenuse FLOAT NOT NULL
);

DECLARE @side1 AS INT = 1;
DECLARE @side2 AS INT = 1;
DECLARE @count AS INT = 1;
DECLARE @element  AS INT = 0;

WHILE (@side1 = @count) 
    BEGIN
        WHILE @side2 <= 10 BEGIN
            INSERT INTO dbo.PythagoreanTriangles
                VALUES (@side1, @side2, SQRT((@side2 * @side2) + (@side1 * @side1)));
            UPDATE dbo.PythagoreanTriangles SET Hypotenuse = ROUND(Hypotenuse, 2)

        SET @side2 = @side2 + 1;
        SET @count = @count + 1;
        SET @element = @element + 1;

    IF @element = 10
    BEGIN 
    SET @side1 = @side1 + 1;
    SET @element = 0;

END;
END;
END;

输出应如下所示:

1 1 1.41
1 2 2.24
1 3 ...
1 4 ...
1 5
1 6
1 7
1 8
1 9
1 10
2 2
2 3
2 4
2 5
2 6
2 7
2 8
2 9
2 10
…………
........等等

9 9
9 10
10 10

【问题讨论】:

  • 通过比较@side1 和@count,您到底想做什么?第二次点击你的外部“while”,@count=11 和@side1=2。
  • 再想一想,如果问题是我认为的问题,则需要在@side1 递增后分配@count=@side1,并将外部循环更改为“while (@side1
  • 在这种情况下,嵌套循环似乎是不必要的复杂化。为什么不是从 1 到 10 的单个循环?更好的是,阅读@GarethD 的答案。
  • 谢谢,我想通了!!

标签: sql loops while-loop


【解决方案1】:

您可以使用单个插入来完成此操作,并且我始终建议您避免使用循环/游标。

WITH Numbers AS
(   SELECT  TOP 10 Number = ROW_NUMBER() OVER(ORDER BY object_id)
    FROM    sys.all_objects
)
INSERT dbo.PythagoreanTriangles (Side1, Side2, Hypotenuse)
SELECT  Side1 = a.Number, 
        Side2 = b.Number,
        Hypotenuse = ROUND(SQRT(POWER(a.Number, 2) + POWER(b.Number, 2)), 2)
FROM    Numbers a
        CROSS JOIN Numbers b;

Example on SQL Fiddle


虽然要实际回答您的问题,但您的循环会在一次迭代后退出,因为您有以下条件:

WHILE (@side1 = @count) 

在@side2 1 - 10 的第一次迭代之后,您执行SET @side1 = @side1 + 1;。由于@Count = 1@Side1 现在为2,您的WHILE 谓词不再为真,因此外部循环退出。尽管我不提倡这种方法,但要使循环正常工作,您需要更改外部 while 谓词。可能是这样的:

DECLARE @side1 AS INT = 1;
DECLARE @side2 AS INT = 1;

WHILE (@side1 <= 10) 
    BEGIN
        WHILE @side2 <= 10 
            BEGIN
                INSERT INTO dbo.PythagoreanTriangles
                    VALUES (@side1, @side2, SQRT((@side2 * @side2) + (@side1 * @side1)));
                UPDATE dbo.PythagoreanTriangles SET Hypotenuse = ROUND(Hypotenuse, 2)

                SET @side2 = @side2 + 1;
            END;

            SET @side2 = 1;
            SET @side1 = @side1 + 1;
    END;

Example on SQL Fiddle

【讨论】:

  • 很好的解决方案,虽然它并不能真正帮助 OP 解决他的WHILE 循环问题。到目前为止,我更喜欢你的方法而不是循环!
  • 感谢您的帮助!我想通了!