我使用的是Azure的SQL数据库& MS SQL Server Management Studio和我想知道是否可以创建一个自我维护的自引用表。
我有三张桌子:Race,Runner,Names。 Race表包括以下列:
第二个表是Runner。 Runner包含以下列:
名称表包括以下列:
感兴趣的列是Runner Table中的Prior_Race_ID。我想通过触发器或存储过程自动填充此字段,但我不确定是否可以这样做以及如何进行此操作。目标是通过遍历Prior_Race_ID字段,能够非常快速,轻松地获得所有参赛者的比赛。
任何人都可以向我指出一个好的资源或参考资料,解释这是否以及如何实现。此外,如果有一个实现我的目标的首选方法,请分享。
感谢您的投入。
答案 0 :(得分:2)
好的,我们想要为每个参赛者(比Names
更好的名字?)找到他们最近的两场比赛。您可以编写如下查询:
SELECT
* --TODO - Specific columns
FROM
(SELECT
*, --TODO - Specific columns
ROW_NUMBER() OVER (PARTITION BY n.Name_ID ORDER BY r.Race_Date DESC) rn
FROM
Names n
inner join
Runners rs
on
n.Name_ID = rs.Name_ID
inner join
Races r
on
rs.Race_ID = r.Race_ID
) t
WHERE
t.rn in (1,2)
每个竞争对手应该产生两行。如果需要,如果你想要每个竞争对手一行,你就可以PIVOT这些数据,但我通常会把它留到表示层,而不是在SQL中。
所以,不,我甚至不会有Prior_Race_ID
列。作为一般规则,不要存储可以计算的数据 - 这只会导致该数据与基础数据相比不正确的机会。
答案 1 :(得分:1)
运行以下sql(这里的独特之处是避免跑步者在同一天有多场比赛):
update runner r1
set r1.prior_race_id =
(
select distinct race.race_id from runner, race where runner.race_id = race.race_id and runner.runner_id = r1.runner_id group by runner.runner_id having race.race_date = max(race.race_date)
)