sql-server - T-SQL存储过程执行select两次?
问题描述
DROP PROCEDURE showMatchOnDate
go
CREATE PROCEDURE showMatchOnDate
@MatchDate DATE
AS
DECLARE @tempTeams TABLE
(
Id CHAR(3) PRIMARY KEY,
name VARCHAR(40),
nomatches INT,
owngoals INT,
othergoals INT,
points INT
)
INSERT INTO @tempTeams(Id, name, nomatches, owngoals, othergoals, points)
SELECT * FROM teams
DECLARE @homeGoals INT
DECLARE @outGoals INT
DECLARE @homeID CHAR(3)
DECLARE @outID CHAR(3)
DECLARE @count INT
DECLARE @totalAmount INT
SET @totalAmount = (SELECT COUNT(*) FROM matches WHERE matchdate <= @MatchDate)
SET @count = 1
SELECT @totalAmount
WHILE (@count <= @totalAmount)
BEGIN
SELECT @homeGoals = (SELECT homegoal FROM matches WHERE Id = @count)
SELECT @outGoals = (SELECT outgoal FROM matches WHERE Id = @count)
SELECT @homeID = (SELECT homeid FROM matches WHERE Id = @count)
SELECT @outID = (SELECT outid FROM matches WHERE Id = @count)
UPDATE @tempTeams
SET nomatches = nomatches + 1
WHERE Id = @homeID OR Id = @outID
UPDATE @tempTeams
SET owngoals = owngoals + @homeGoals
WHERE Id = @homeID
UPDATE @tempTeams
SET owngoals = owngoals + @outGoals
WHERE Id = @outID
UPDATE @tempTeams
SET othergoals = othergoals + @outGoals
WHERE Id = @homeID
UPDATE @tempTeams
SET othergoals = othergoals + @homeGoals
WHERE Id = @outID
UPDATE @tempTeams
SET points = points + 3
WHERE Id = @homeID AND @homeGoals > @outGoals
UPDATE @tempTeams
SET points = points + 3
WHERE Id = @outID AND @outGoals > @homeGoals
IF @outGoals = @homeGoals
UPDATE @tempTeams
SET points = points + 1
WHERE Id = @homeID OR (Id = @outID)
SET @count = @count + 1
END
SELECT * FROM @tempTeams
go
出于某种原因,当我运行它时,我得到了每个项目的副本。我不想要。显然我想要正确的值,应该是 154 个不同的项目。但相反,我得到 308,并且每个项目都是重复的。有谁知道为什么?
解决方案
首先检查你的“团队”表,你可以在这里有额外的数据,如果有,删除重复的。
最佳实践还需要编写显式字段以避免将来出现错误,如下所示:
insert into @tempTeams(Id,name,nomatches,owngoals,othergoals,points)
select Id,name,nomatches,owngoals,othergoals,points
from teams
推荐阅读
- python - Flask 测试 - 从蓝图动态测试所有受保护的路由
- ruby-on-rails - 使用 attr_encrypted 使用新密钥加密新数据(覆盖旧数据)
- amazon-web-services - x509:由未知机构使用 AWS IoT 签署的证书
- sql - 删除后表仍然存在,整个数据库也存在
- python - Python signxml XML 签名包。如何为 Signature 标签添加 xml 占位符?
- angular - 运行时错误:找不到名称为“1”的控件
- ios - 如何在 Swift 中等待一个数组被填充
- openstreetmap - Osmdroid 无法解析 DefaultResourceProxyImpl 和 ResourceProxy 的符号
- spring-security - CSRF 令牌已与此客户端关联”,但未禁用 CSRF
- swift - 如何在 Flutter iOS Native 代码(Swift)中使用多个 EventChannel