0

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

当前表:

-------------------------------------------------- --------------------------
身份证 | TYPE_ID | 创建日期 | SEQUENCE_NO
-------------------------------------------------- --------------------------
1 1 24-APR-10 空
-------------------------------------------------- --------------------------
2 1 25-APR-10 空
-------------------------------------------------- --------------------------
3 1 26-APR-10 空
-------------------------------------------------- --------------------------
4 2 22-APR-10 空
-------------------------------------------------- --------------------------
5 2 24-APR-10 空
-------------------------------------------------- -------------------------
6 3 27-APR-10 空

预期结果:

-------------------------------------------------- --------------------------
身份证 | TYPE_ID | 创建日期 | SEQUENCE_NO
-------------------------------------------------- --------------------------
1 1 10 年 4 月 24 日 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 程序应该没问题。

4

2 回答 2

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 来连接查询和合并表:

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;

由于您显然正在寻找 OracleSQL Server 的解决方案(您在最初的问题中也没有提到),因此上述内容不适用于 SQL Server(它没有任何类似于 Oracle 的 rowid 的东西)。

为了使这在两个 DBMS 中可靠地工作,您必须找到表的主键。

于 2013-09-19T06:56:44.957 回答
0
select ID,TYPE_ID,CREATED_DATE,ROW_NUMBER() OVER ( PARTITION BY TYPE_ID ) AS SEQUENCE_NO
FROM Table_name 

试试这个让我知道它是否有效

于 2013-09-19T07:04:41.007 回答