Sql 重复记录的序列无更新

Sql 重复记录的序列无更新,sql,oracle,Sql,Oracle,我有一个如下表,我需要根据复制记录(序列号)更新“序列号”。我需要这方面的帮助: 当前表格: ----------------------------------------------------------------------------- ID | TYPE_ID | CREATED_DATE | 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 |类型| ID |创建|日期|序列|编号 ----------------------------------------------------------------------------- 2011年4月24日零 ----------------------------------------------------------------------------- 2011年4月25日零 ----------------------------------------------------------------------------- 2011年4月26日空 ---------------------------------------------------------------------------- 4.2 2010年4月22日无效 ---------------------------------------------------------------------------- 5.2 2010年4月24日无效 --------------------------------------------------------------------------- 2010年4月27日6 3无效 预期结果:

----------------------------------------------------------------------------- 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 ----------------------------------------------------------------------------- ID |类型| ID |创建|日期|序列|编号 ----------------------------------------------------------------------------- 2011年4月24日1 ----------------------------------------------------------------------------- 2011年4月25日2 ----------------------------------------------------------------------------- 2011年4月26日3 ---------------------------------------------------------------------------- 4.2 2010年4月22日1 ---------------------------------------------------------------------------- 5.2 2010年4月24日2 --------------------------------------------------------------------------- 6 3 27-APR-10 1 SQL查询或PL/SQL程序应该可以使用。

这应该可以:

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中都能可靠地工作,您必须找到表的主键

select ID,TYPE_ID,CREATED_DATE,ROW_NUMBER() OVER ( PARTITION BY TYPE_ID ) AS SEQUENCE_NO
FROM Table_name 
试试这个
让我知道它是否有效

尝试在类型_id上使用RANK(),谢谢您的查询…但它在“t.id=id.id”上显示错误。@Srinivash:抱歉,复制和粘贴错误。应该是
t.id=tb.id
yes…它在SQL Server中工作得很好…但在oracle SQL developer中不是这样…我面临以下错误:错误报告:SQL错误:ORA-30926:无法在源表30926中获得一组稳定的行。00000-“无法在源表中获取稳定的行集”*原因:由于dml活动较大或where子句不确定,无法获取稳定的行集*措施:删除任何不确定的where子句并重新发布dml。然后有一些事情您没有告诉我们:顺便问一下:SQL Server是如何做到这一点的?在您的问题中,您只是在谈论Oracle。@Srinivash-您似乎有重复ID值的行。(在上面的SQL FIDLE中,尝试添加ID为6的第二行,“构建模式”将获得ORA-30926)。您的示例数据表明它们是唯一的,ID列通常是唯一的,但会像David建议的那样由PK或UK强制执行。如果您希望它是唯一的,那么您需要清理数据,最好在ID上设置一个约束,以防止将来重复。嗨,Sandeep,它不起作用,它缺少ORDER BY子句…我想更新字段,而不是用于select
update Table\u name SET RankCol=SubQuery.Rank FROM(选择ID,TYPE_ID,CREATED_DATE,ROW_NUMBER()(按TYPE_ID按TYPE_ID排序,按TYPE_ID)作为表名的秩)子查询内部连接表名在子查询上。ID=表名。ID=表名和子查询。TYPE_ID=表名。TYPE_ID
这行吗?请检查并让我知道