T-SQL 无限循环和警告:聚合或其他 SET 操作消除 Null 值

T-SQL Infinite Loop and Warning: Null value is eliminated by an aggregate or other SET operation

提问人:EternalLearner 提问时间:10/23/2023 最后编辑:EternalLearner 更新时间:10/23/2023 访问量:36

问:

我目前正在 T-SQL 中模拟石头、剪刀布锦标赛,但遇到了一些障碍:

我发现自己处于无限循环中,并收到一条警告,指示“聚合或其他 SET 操作消除了 Null 值”。任何人都可以花点时间检查我的代码并提供一些建议吗?您的帮助将受到高度重视!谢谢!

DROP TABLE IF EXISTS #Tournament;
CREATE TABLE #Tournament (
    row_id INT IDENTITY(1,1) PRIMARY KEY,
    id INT,
    name VARCHAR(255),
    first_choice INT
);

INSERT INTO #Tournament
SELECT P.id, P.name, P.first_choice FROM RPS_Players P
ORDER BY NEWID();

DROP TABLE IF EXISTS #First_Group;
CREATE TABLE #First_Group (
    id INT PRIMARY KEY,
    name VARCHAR(255),
    first_choice INT,
    "group" INT
);

INSERT INTO #First_Group
SELECT id, name, first_choice, (ROW_NUMBER() OVER (ORDER BY row_id) + 1) / 2 AS "group"
FROM #Tournament;


DECLARE @NumberOfGroups INT;
SELECT @NumberOfGroups = MAX([group]) FROM #First_Group;
DECLARE @Counter INT = 1;
DECLARE @Condition VARCHAR(255) = 'Tie';
DECLARE @WinnersCount INT = 0;
DECLARE @IdPlay INT;
SELECT @IdPlay = MAX(id) FROM RPS_Plays;
IF @IdPlay IS NULL SET @IdPlay = 0;
DECLARE @IdMatch INT;


DROP TABLE IF EXISTS #ENCOUNTER;
CREATE TABLE #ENCOUNTER (
    id INT,
    condition VARCHAR(255),
    id_1 INT,
    name_1 VARCHAR(255),
    first_choice_1 INT,
    group_1 INT,
    row_number_1 INT,
    id_2 INT,
    name_2 VARCHAR(255),
    first_choice_2 INT,
    group_2 INT,
    row_number_2 INT
);

WHILE (@Counter <= @NumberOfGroups AND @WinnersCount < @NumberOfGroups)
BEGIN
    SELECT * FROM #First_Group;
    WHILE (@Condition = 'Tie')
    BEGIN

        WITH ShuffledPlayersCTE AS ( 
            SELECT *, ROW_NUMBER() OVER (ORDER BY NEWID()) as row_number 
            FROM #First_Group
            WHERE "group" = @Counter
        ),

        PlayerPairingCTE AS (
            SELECT
                MAX(CASE WHEN row_number = 1 THEN id END) AS id_1,
                MAX(CASE WHEN row_number = 1 THEN name END) AS name_1,
                MAX(CASE WHEN row_number = 1 THEN first_choice END) AS first_choice_1,
                MAX(CASE WHEN row_number = 1 THEN "group" END) AS group_1,
                MAX(CASE WHEN row_number = 1 THEN row_number END) AS row_number_1,
                MAX(CASE WHEN row_number = 2 THEN id END) AS id_2,
                MAX(CASE WHEN row_number = 2 THEN name END) AS name_2,
                MAX(CASE WHEN row_number = 2 THEN first_choice END) AS first_choice_2,
                MAX(CASE WHEN row_number = 2 THEN "group" END) AS group_2,
                MAX(CASE WHEN row_number = 2 THEN row_number END) AS row_number_2
            FROM ShuffledPlayersCTE
        ),
        

        MatchOutcomeCTE AS (
            SELECT WC.id, WC.condition, PlayerPairingCTE.*
            FROM PlayerPairingCTE
            INNER JOIN RPS_Winning_Conditions WC ON PlayerPairingCTE.first_choice_1 = WC.first_hand_id
            AND PlayerPairingCTE.first_choice_2 = WC.second_hand_id 
        )
        
        INSERT INTO #ENCOUNTER
        SELECT * FROM MatchOutcomeCTE;

        SELECT TOP 1 @Condition = condition FROM #ENCOUNTER;
    END;

    IF @Condition != 'Tie'
    BEGIN
        INSERT INTO RPS_Matches (player_1_id, player_2_id, player_1_choice, player_2_choice, result)
        SELECT id_1, id_2, first_choice_1, first_choice_2, id FROM #ENCOUNTER;
        SELECT @IdMatch = MAX(id) FROM RPS_Matches;
        INSERT INTO RPS_Plays (id, match_id)
        VALUES (@IdPlay + 1, @IdMatch);

        SET @WinnersCount = @WinnersCount + 1;
        DELETE FROM #ENCOUNTER;
 
    END

    SET @Counter = @Counter + 1;
    SELECT @Counter;
    SET @Condition = 'Tie'; 
END;

DROP TABLE IF EXISTS #ENCOUNTER;

我的球员表如下所示:

id  name            first_choice    second_choice   third_choice
1   Vera            1           2           3
2   Arnold Layne    2           3           1
3   Emily           3           1           2
4   Matilda Mother  1           3           2
5   Julia Dream 2           1           3
6   Eugene          3           2               1
7   Seamus          1           2               3
8   Louie Louie 2           3           1

我的 winnig 条件表如下所示:

id  first_hand_id   second_hand_id  condition
1   1           1           Tie
2   2           1           Win
3   3           1           Lose
4   1           2           Lose
5   2           2           Tie
6   3           2           Win
7   1           3           Win
8   2           3           Lose
9   3           3           Tie

我不是想做一个游戏,只是一个锦标赛的模拟。

T-SQL WHILE-LOOP 警告无限 循环

评论

1赞 Thom A 10/23/2023
警告只是一个警告。这既不是问题也不是错误

答: 暂无答案