是否可以在SQl Server中创建具有自引用的自我维护表

时间:2016-01-18 14:03:42

标签: sql-server azure

我使用的是Azure的SQL数据库& MS SQL Server Management Studio和我想知道是否可以创建一个自我维护的自引用表。

我有三张桌子:Race,Runner,Names。 Race表包括以下列:

  1. Race_ID(PK)
  2. Race_Date
  3. Race_Distance
  4. Number_of_Runners
  5. 第二个表是Runner。 Runner包含以下列:

    1. Runner_Id(PK)
    2. Race_ID(外键)
    3. 名_ID
    4. Finish_Position
    5. Prior_Race_ID
    6. 名称表包括以下列:

      1. 姓名
      2. 名_ID
      3. 感兴趣的列是Runner Table中的Prior_Race_ID。我想通过触发器或存储过程自动填充此字段,但我不确定是否可以这样做以及如何进行此操作。目标是通过遍历Prior_Race_ID字段,能够非常快速,轻松地获得所有参赛者的比赛。

        任何人都可以向我指出一个好的资源或参考资料,解释这是否以及如何实现。此外,如果有一个实现我的目标的首选方法,请分享。

        感谢您的投入。

2 个答案:

答案 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)
)