序列没有重复记录的更新

时间:2013-09-19 06:34:45

标签: sql oracle

我有一个如下表格,我需要根据复制记录(SEQUENCE_NO)更新“SEQUENCE_NO”。我需要帮助:

当前表:

-----------------------------------------------------------------------------
ID    |     TYPE_ID   |    CREATED_DATE    |   SEQUENCE_NO
-----------------------------------------------------------------------------
1               1               24-APR-10            NULL
-----------------------------------------------------------------------------
2               1               25-APR-10            NULL
-----------------------------------------------------------------------------
3               1               26-APR-10            NULL
----------------------------------------------------------------------------
4               2               22-APR-10            NULL
----------------------------------------------------------------------------
5               2               24-APR-10            NULL
---------------------------------------------------------------------------
6               3               27-APR-10            NULL

期待结果:

-----------------------------------------------------------------------------
ID    |     TYPE_ID   |    CREATED_DATE    |   SEQUENCE_NO
-----------------------------------------------------------------------------
1               1               24-APR-10            1
-----------------------------------------------------------------------------
2               1               25-APR-10            2
-----------------------------------------------------------------------------
3               1               26-APR-10            3
----------------------------------------------------------------------------
4               2               22-APR-10            1
----------------------------------------------------------------------------
5               2               24-APR-10            2
---------------------------------------------------------------------------
6               3               27-APR-10            1

SQL查询或PL / SQL程序应该没问题。

2 个答案:

答案 0 :(得分:2)

这应该这样做:

merge into the_table tb
using (
  select id,
         row_number() over (partition by type_id order by created_date) as rn
  from the_table
) t on (t.id = tb.id)
when matched then update
  set sequence_no = t.rn;

显然,id不是您的主键(您应该从一开始就告诉我们)。

您可以在表中找到唯一的列组合以在合并表和查询之间建立连接,或者作为快速解决方法(对于Oracle),您可以使用rowid加入查询和合并表: / p>

merge into the_table tb
using (
  select rowid as rid,
         row_number() over (partition by type_id order by created_date) as rn
  from the_table
) t on (t.rid = tb.rowid)
when matched then update
  set sequence_no = t.rn;

由于您显然在寻找Oracle SQL Server的解决方案(您在原始问题中没有提及),上述内容将无法与SQL Server一起使用(它没有任何内容)类似于Oracle的rowid)。

为了在两个DBMS中可靠地工作,您来查找表的主键。

答案 1 :(得分:0)

select ID,TYPE_ID,CREATED_DATE,ROW_NUMBER() OVER ( PARTITION BY TYPE_ID ) AS SEQUENCE_NO
FROM Table_name 

试试这个 让我知道它的工作与否