如何在Oracle SQL中更新多个重复行中的单行

如何在Oracle SQL中更新多个重复行中的单行,sql,oracle,Sql,Oracle,我有这张桌子: group_id | invoice_amt|insert_date ---------+------------+------ 23 1002 10/8/2018 23 1002 10/8/2018 23 1003 11/8/2018 21 1004 12/8/2018 当我使用以下查询时 select distinct group_id, invoice_

我有这张桌子:

group_id | invoice_amt|insert_date
---------+------------+------
23        1002         10/8/2018
23        1002         10/8/2018
23        1003         11/8/2018
21        1004         12/8/2018
当我使用以下查询时

select distinct group_id, invoice_amt, insert_date 
from table

我拿到最后三排了。但我需要全部四排。为此,我需要通过更改日期来更新最上面的一行。组id和发票金额不应更改。如何做到这一点?

如果您需要全部四行,只需删除DISTINCT,因为它强制使用唯一记录集:

select group_id, invoice_amt, insert_date from table
如果需要更改除一个值以外的所有副本的日期,并且表本身中没有唯一标识符,则可以使用内部Oracle伪列:


如果您需要全部四行,只需删除DISTINCT,因为它强制使用唯一记录集:

select group_id, invoice_amt, insert_date from table
如果需要更改除一个值以外的所有副本的日期,并且表本身中没有唯一标识符,则可以使用内部Oracle伪列:

像这样的

update t
    set insert_date = insert_date + 1
    where rowid > (select min(rowid)
                   from t t2
                   where t2.group_id = t.group_id and t2.invoice_amt = t.invoice_amt
                  );
像这样的

update t
    set insert_date = insert_date + 1
    where rowid > (select min(rowid)
                   from t t2
                   where t2.group_id = t.group_id and t2.invoice_amt = t.invoice_amt
                  );

这不是重复条目。这是两次真实的登场。所以我应该更改日期列的时间毫秒。必须区分的原因是,有时可以创建真正的重复条目并避免它们。在这种情况下,将insert_date列更改为带时区的timestamp类型,您的问题将在将来得到解决。然后执行更新。另外,重新思考复制品——为什么可以制作真正的复制品?那么它们真的是重复的吗?这不是重复条目。这是两次真实的登场。所以我应该更改日期列的时间毫秒。必须区分的原因是,有时可以创建真正的重复条目并避免它们。在这种情况下,将insert_date列更改为带时区的timestamp类型,您的问题将在将来得到解决。然后执行更新。另外,重新思考复制品——为什么可以制作真正的复制品?那么它们真的是重复的吗?