SQL WHILE循环

3

我一直在尝试在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。 - aehiilrs
进一步思考,如果问题是我所想的那样,你需要在@side1增加后将@count=@side1赋值,并将外部循环更改为“while (@side1 <= 10)” - aehiilrs
嵌套循环在这种情况下似乎是不必要的复杂化。为什么不使用从1到10的单个循环呢?更好的方法是阅读@GarethD的答案。 - Dan Bracuk
1
谢谢,我已经想通了! - ChaseHardin
1个回答

4
你可以使用单个插入语句来完成此操作,尽可能避免使用循环/游标。
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;

在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;

SQL Fiddle上的示例


非常棒的解决方案,虽然它并没有真正帮助 OP 解决了他的 WHILE 循环问题。但我还是更喜欢你的方法,比起循环好多了! - dub stylee
谢谢你的帮助!我已经弄明白了! - ChaseHardin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接