2014-03-30 56 views
0

您好我新与SQL查询我需要帮助。使用范围组更新列值

我有一个表格,其中QuestionId从0到8,但有时除了零值可以重复,我想要的是顶部创建一个组从0到8,当其他0发生时,它将是一个新的组,而不是创建我想给随机数到SurveyID列。

QuestionID SurveyID 
    0   NULL 
    1   NULL 
    2   NULL 
    3   NULL 
    4   NULL 
    4   NULL 
    5   NULL 
    6   NULL 
    7   NULL 
    7   NULL 
    8   NULL 
    8   NULL 
    0   NULL 
    1   NULL 
    2   NULL 
    3   NULL 
    4   NULL 
    4   NULL 
    5   NULL 
    6   NULL 
    6   NULL 
    7   NULL 
    8   NULL 
    0   NULL 
    1   NULL 
    2   NULL 

我想之前第0秒。

从第一0更新surveyID组我想给唯一随机值的组形式0-8然后再一个新的随机值,以0 - 8

QuestionID SurveyID 
    0   8888 
    1   8888 
    2   8888 
    3   8888 
    4   8888 
    4   8888 
    5   8888 
    6   8888 
    7   8888 
    7   8888 
    8   8888 
    8   8888 
    0   1232 
    1   1232 
    2   1232 
    3   1232 

我希望这样做。

+0

您的数据库是? – Mihai

+0

Microsoft SQL Server 2008 R2 –

+0

第一个和第二个0与您有什么关系?您是否拥有标识列? – Mihai

回答

1

您可以使用CTE查询以您想要的方式生成SurveyId。我假设您的主键列名为Id,表seq - 请替换它。您也可以使用不同的方式来生成随机数 - 取决于您。

with cte as 
(
    select Id, questionId, convert(int, rand() * Id * 1000) as surverId 
    from seq 
    where questionId = 0 

    union all 

    select seq.Id, seq.questionId, cte.surverId 
    from seq 
    inner join cte on cte.Id + 1 = seq.Id 
    where seq.questionId <> 0 
) 

merge seq as target 
using (select * from cte) as source (Id, questionId, surveyId) 
on (target.Id = source.Id) 
when matched then 
    update set target.SurveyId = source.surveyId; 
+0

只是完美的,但另一种帮助是有一种方法,我可以更新和设置surveyID值,因为它现在正在创建一个新的表和显示,并只是完美的我想要的但我可以得到更新值surveyId –

+0

哎呀,抱歉,忘记了更新的一部分。现在查看我的答案。 – Szymon

+0

你是个天才!完美! –