提问人:EternalLearner 提问时间:10/23/2023 最后编辑:EternalLearner 更新时间:10/23/2023 访问量:36
T-SQL 无限循环和警告:聚合或其他 SET 操作消除 Null 值
T-SQL Infinite Loop and Warning: Null value is eliminated by an aggregate or other SET operation
问:
我目前正在 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
我不是想做一个游戏,只是一个锦标赛的模拟。
答: 暂无答案
评论