2016-09-20 74 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表示。 –