我有两张桌子:
Teams [Id],[name],[nomatches],[owngoals],[othergoals],[points]
和
Matches[id],[homeid],[outid],[homegoal],[outgoal],[matchdate]
我有一个触发器会在INSERT,UPDATE,DELETE
触发,因此Teams
表当前得分表始终会更新。
示例:
Select * from teams;
结果:
Name NumberOfMatches OwnGoals OtherGoals Points
-------------------------------------------------------
FC Chelsea 33 61 22 68
FC Barcelona 33 46 34 59
FC Man UD 33 57 50 52
问题:
表Matches
有一列matchdate
。我想重新计算输入日期之前所有比赛的当前得分表(可能是我的触发器)。
我不知道如何根据Date
参数创建临时表来存储重新计算的数据(nomaches,owngoals,其他目标,每个团队的积分)。
到目前为止我所拥有的:
CREATE PROCEDURE check_scoretable
(
@pDate DATE = NULL
)
as
DECLARE @Date DATE = COALESCE(@pDate,GETDATE())
declare @homeid char(3);
declare @outid char(3);
declare @id int;
SELECT * INTO #temp_table2 FROM teams;
SET NOCOUNT ON; -- copy of the teams table
declare cur CURSOR LOCAL for
select homeid, outid
from matches where matches.matchdate < @Date
open cur
fetch next from cur into @homeid, @outid
while @@FETCH_STATUS = 0 BEGIN
select @homeid;
select @outid;
--Increment number of matches
update #temp_table2 set #temp_table2.nomatches = #temp_table2.nomatches+1 where #temp_table2.id = @homeid;
update #temp_table2 set #temp_table2.nomatches = #temp_table2.nomatches+1 where #temp_table2.id = @outid;
fetch next from cur into @homeid, @outid
END
close cur
deallocate cur
-- Test the stored procedure
DECLARE @d DATETIME
SELECT @d = GETDATE()
EXEC check_scoretable @date = @d
答案 0 :(得分:1)
您可以编写存储过程,就像您已经完成并将日期传递给它一样。
CREATE PROCEDURE check_scoretable
(
@pDate DATE = NULL
)
as
然而,不是光标,而是做
之类的事情SELECT tm.name,sum(tm.noMatches) as NumberMatches,sum(tm.ownGoals) as OwnGoals,
sum(tm.otherGoals) as Othergoals,sum(tm.Points) as Points
FROM Team tm
JOIN Matches mc on mc.homeId=tm.id or mc.outId=tm.id
WHERE mc.matchDate <= @pDate
这将为您提供所需的结果。
CAVEAT:您的数据库设计不好,因为其中包含冗余数据。例如,当您可以通过
计算匹配数时,您正在跟踪团队表中的匹配数SELECT count(*) FROM matches WHERE homeId=@id or OutId=@id
总目标的相同类型的操作等。
您可能遇到的问题是,如果由于某种原因,团队记录未更新,则团队中列出的匹配数可能与总共播放的匹配数相匹配。