更新SQL中的唯一行

时间:2011-09-01 12:42:11

标签: sql oracle plsql

我有一张桌子

id | col1 | col3| col4
1  | x    |  r  |
2  | y    |  m  |
3  | z    |  p  |
4  | x    |  r  |

我必须更新此表的所有唯一行 即

  id | col1 | col3| col4
  1  | x    |  r  |  1
  2  | y    |  m  |  1
  3  | z    |  p  |  1
  4  | x    |  r  |  0

我可以通过

获取唯一的行
  select distinct col1,col2 from table

。但是如何识别这些行以便更新它们。请帮助。

4 个答案:

答案 0 :(得分:4)

您可以使用group by来选择唯一结果:

SELECT MIN(ID) AS ID FROM TABLE GROUP BY COL1, COL3;

  id | col1 | col3
  1  | x    |  r  
  2  | y    |  m  
  3  | z    |  p  

然后

UPDATE TABLE SET col4 = 1 WHERE ID IN (SELECT MIN(ID) FROM TABLE GROUP BY COL1, COL3);

限制是id列应该是唯一的。

答案 1 :(得分:0)

如果它是一张足够小的桌子,这就是你可以做的事情

第1步:将所有内容更新为1

Update Table Set Col4 = 1

步骤2:将所有重复更新为0(OTTOMH)

Update Table
Set Col4 = 0
From 
(
    Select Col1, Min (Id) FirstId
    From Table
    Group By Col1
    Having Count (*) > 1
) Duplicates
Where Table.Col1 = Duplicates.Col1
And Table.Id <> Duplicates.FirstId

答案 2 :(得分:0)

您也可以尝试:

UPDATE test
   SET col4 = 1
 WHERE id IN
     (
       SELECT t1.id
         FROM table_name t1
         LEFT JOIN table_name t2
           ON t2.id < t1.id
          AND t2.col1 = t1.col1
          AND t2.col3 = t1.col3
        WHERE t2.id IS NULL
     )

答案 3 :(得分:0)

另一个稍微复杂的选项,即在一次点击中同时设置01值:

update my_table mt
set col4 = (
    select case when rn = 1 then 1 else 0 end
    from (
        select id,
            row_number() over (partition by col1, col3 order by id) as rn
        from my_table) tt
    where tt.id = mt.id);

4 rows updated.

select * from my_table order by id;

        ID COL1 COL3       COL4
---------- ---- ---- ----------
         1 x    r             1
         2 y    m             1
         3 z    p             1
         4 x    r             0

这只是使用row_number()决定哪个唯一组合是第一个,任意使用最低id,指定值为1,其他一切为零。