为具有相同字段值集的记录设置相同的ID

时间:2015-03-06 03:03:00

标签: sql oracle oracle11g

我有以下数据需要获取具有相同ACTION,PARENT_ID,CHILD_ID和TYPE的记录,并使用最少ID设置这些记录的ID。 在下面的情况下,交易1456014,1456016,1456018和1456019具有相同的ACTION,PARENT_ID,CHILD_ID和TYPE组。所以我需要将这4条记录的ID设置为12851,这是4条中最少的。

TXN_ID      ACTION  ID      PARENT_ID       CHILD_ID    TYPE
1456014     CREATED 12851   653022          370023      Acquisition
1456016     CREATED 12852   653022          370023      Acquisition
1456018     CREATED 12853   653022          370023      Acquisition
1456019     CREATED 12854   653022          370023      Acquisition
1456013     CREATED 12855   653020          370023      Acquisition
1456012     CREATED 12856   653022          370024      Acquisition

1 个答案:

答案 0 :(得分:1)

这样的事情应该做你想要的事情

UPDATE table_name dest
   SET dest.id = (SELECT MIN(src.id)
                    FROM table_name src
                   WHERE src.action    = dest.action
                     AND src.parent_id = dest.parent_id
                     AND src.child_id  = dest.child_id
                     AND src.type      = dest.type)
 WHERE EXISTS( SELECT 1
                 FROM table_name src
                WHERE src.action    = dest.action
                  AND src.parent_id = dest.parent_id
                  AND src.child_id  = dest.child_id
                  AND src.type      = dest.type
                  AND src.id       != dest.id );

如果要更新大部分数据,您可能希望删除EXISTS子句并更新每一行(产生一些无意义更新的成本)而不是承担执行{的成本{1}}。

退一步说,你想要首先执行此操作的事实意味着你对表有一个规范化问题。如果EXISTS取决于idactiontypechild_id,并且这四个属性至少不是唯一键,则表示这些属性可能需要在数据模型中考虑因素。