更新语句查询

时间:2011-01-26 16:04:51

标签: sql sql-server sql-server-2005 tsql

我有一个名为status的表,其中包含如下数据:

ID   Status  Number
1    S       1
1    p       2
1    S       3
1    C       4
2    S       5
2    R       6

我想摆脱这个表中的重复项,所以我在这个表中添加了另一个名为Flag的列,我为所有记录设置为1。现在我的表看起来像这样:

ID   Status  Number  Flag
1    S       1       Y
1    p       2       Y
1    S       3       Y
1    C       4       Y
2    S       5       Y
2    R       6       Y

我正在写一个更新查询,如果它有重复项并且更新查询是,则将标志列更新为N.

Number列是表中的标识。

udate status
set flag = 'N'
where flag = 'Y' and Number in 
(select min(Number) from status
where id = 1
having count(*) >1)

所以,如果我这个查询它给了我没有重复的数据

Select status from status
where flag = Y

但是如果我有3个类似的状态值,则更新查询不起作用。仅当我有2个类似的状态值时,更新才有效。

有人可以建议我这样做吗?

2 个答案:

答案 0 :(得分:2)

使用此标记仅标记重复项(保持第一个值不变):

WITH    q AS
        (
        SELECT  *, ROW_NUMBER() OVER (PARTITION BY id, status ORDER BY number) AS rn
        FROM    status
        )
UPDATE  q
SET     flag = CASE rn WHEN 1 THEN 'Y' ELSE 'N' END

或以此标记所有具有重复项的值:

WITH    q AS
        (
        SELECT  *, COUNT(*) OVER (PARTITION BY id, status) AS cnt
        FROM    status
        )
UPDATE  q
SET     flag = CASE cnt WHEN 1 THEN 'Y' ELSE 'N' END

答案 1 :(得分:0)

您可以使用row_number()选择特定分区的第一行:

update  t
set     flag = case when rn = 1 then 'Y' else 'N' end
from    (
        select  ROW_NUMBER() over (partition by status order by number) as rn
        ,       *
        from    @t
        ) t