2016-09-20 75 views
0

鉴于:我有一个带有3列即ID,MARKS和主题的表。用于在更新语句中重复的SQL代码逻辑

例如 -

表名(商标

ID  Marks Subject 
323232 20 
323232 10 
323232 25 
323232  2 

为主题专栏中,我们被要求从下面的表更新

表名(主题

ID  Subject 
323232 ENG 
323232 SCI 
323232 MAT 

在这种情况下,我们需要更新如下主题的主题列:

ID  Marks Subject 
323232 20 ENG 
323232 10 SCI 
323232 25 MAT 
323232 2  ENG  --- ONCE THE 3 DISTINCT VALUES ARE UPDATED WE MUST REPEAT UNTIL THE ID CHANGES. 

我曾尝试使用while循环逻辑更新,但更新MAT值后,我不能回去ENG 。

让我知道这是否可以使用SQL查询来实现。提前致谢!!!

+1

请分享你有什么到目前为止已经试过。另外,你真的在​​运行SQL Server 2008和SQL Server 2012吗?如果没有,请修复标签。哦,格式化。 – sstan

+2

所以,你不关心哪个标记更新与哪个主题?,对我没有多大意义 – Lamak

+0

你可以使用光标更新,但老实说,它的奇怪,你将如何知道标记25是为MAT而不是ENG,哪种标准被用来以这种方式对条目进行排序? – Monah

回答

1

我不知道你为什么会想,但你可以用模算术做到这一点:

with toupdate as (
     select m.*, 
      row_number() over (partition by id order by (select null)) as seqnum 
     from marks m 
    ), 
    t as (
     select s.*, count(*) over (partition by id) as cnt, 
      row_number() over (partition by id order by (select null)) as seqnum 
     from subject s 
    ) 
update toupdate 
    from toupdate join 
     s 
     on toupdate.id = s.id and toupdate.seqnum % s.cnt = s.seqnum % s.cnt; 
+0

你能解释什么是“与toupdate”意味着在第一行? –

+0

@JohnChristopher。 。 。这就是所谓的通用表格表达式,通常由首字母缩略词CTE表示。 –