Sql 基于多个属性提供新id

Sql 基于多个属性提供新id,sql,oracle,Sql,Oracle,我有一张这样的桌子 +-----+-----+-----+-----+ |att1 | att2| att3| id | +-----------------------+ | a | b | a | 1 | | b | c | c | 2 | | a | b | a | 3 | +-----------------------+ 有几列和一个ID。如果att1、att2和att3相等,我想用一个新的ID替换该ID,如下所示: +-----+-

我有一张这样的桌子

+-----+-----+-----+-----+
|att1 | att2| att3|  id |
+-----------------------+
| a   |  b  |  a  |  1  |
| b   |  c  |  c  |  2  |
| a   |  b  |  a  |  3  |
+-----------------------+
有几列和一个ID。如果att1、att2和att3相等,我想用一个新的ID替换该ID,如下所示:

+-----+-----+-----+-----+
|att1 | att2| att3|  id |
+-----------------------+
| a   |  b  |  a  |  1  |
| b   |  c  |  c  |  2  |
| a   |  b  |  a  |  1  |
+-----------------------+
merge into the_table t
using (
  select att1, att2, att3, dense_rank() over (partition by att1, att2, att3 order by att1) as rnk
  from the_table 
) x on (x.att1 = t.att1 and x.att2 = t.att2 and t.att3 = x.att3)
when matched then update
   set old_id = x.new_id;
我尝试了经典的merge-in语句,在属性上使用稠密的_-rank()函数,如下所示:

+-----+-----+-----+-----+
|att1 | att2| att3|  id |
+-----------------------+
| a   |  b  |  a  |  1  |
| b   |  c  |  c  |  2  |
| a   |  b  |  a  |  1  |
+-----------------------+
merge into the_table t
using (
  select att1, att2, att3, dense_rank() over (partition by att1, att2, att3 order by att1) as rnk
  from the_table 
) x on (x.att1 = t.att1 and x.att2 = t.att2 and t.att3 = x.att3)
when matched then update
   set old_id = x.new_id;
但这不起作用,因为
选择att1,att2,att3,density_rank()(按att1划分,att2,att3按att1排序)作为rnk
并没有像我预期的那样为att1,att2和att3的每个分区提供自己的等级,而是所有的分区都只得到等级1


我做错了什么?

回答我自己的问题:

带有rank函数的select应该如下所示,然后按预期工作

select att1, att2, att3, dense_rank() over (order by att1, att2, att3) as rnk

因此,将应该获得相同等级的属性按顺序排列,而不是按分区排列,回答我自己的问题:

带有rank函数的select应该如下所示,然后按预期工作

select att1, att2, att3, dense_rank() over (order by att1, att2, att3) as rnk

因此,将应该获得相同等级的属性按顺序排列,而不是按分区排列,这只是另一种选择-


这只是另一种选择-


我认为这是一种错误的做法。您如何区分相同的行?与其更新id列(这会创建重复的行),不如尝试将现有的子记录更新为另一个id并删除重复的id记录。我认为这是一种错误的方法。您如何区分相同的行?请尝试将现有子记录更新为另一个id并删除重复的id记录,而不是更新id列(这会创建重复的行)。这是更好的解决办法。我建议接受你自己的答案。我必须等2天才能接受我自己的解决方案,所以如果我不忘记的话,我会接受的。这是更好的解决办法。我建议接受你自己的答案。我必须等2天才能接受我自己的解决方案,所以如果我没有忘记的话,我会接受的