我有一个如下表格,我需要根据复制记录(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程序应该没问题。
答案 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
试试这个 让我知道它的工作与否