在delete语句中使用rowid

时间:2012-07-19 15:44:42

标签: oracle sql-delete

使用rowid删除是否有严重的禁忌症?

DELETE FROM NETATEMP.SFAC_TESTATA_CASISTICHE
      WHERE ROWID IN (  SELECT MIN (ROWID)
                          FROM NETATEMP.SFAC_TESTATA_CASISTICHE
                      GROUP BY ID_CASO,
                               DESCRIZIONE_TECNICA,
                               DESCRIZIONE_ANALISI,
                               PDF,
                               SCARTI,
                               DATA_INIZIO_ANALISI,
                               DATA_FINE_ANALISI,
                               DATA_INSTRADAMENTO,
                               DATA_RISOLUZIONE,
                               STRINGA_RICERCA,
                               SETTIMANA,
                               DATA_INIZIO_SETT,
                               DATA_FINE_SETT,
                               FATTURAZIONE,
                               IN_ELABORAZIONE
                        HAVING COUNT (1) > 1);

2 个答案:

答案 0 :(得分:9)

如果你认为min(rowid)返回“最早”的行,那么是的,你有问题(因为它不会)

如果你只使用min(rowid)获取其中一个副本(并且你不关心哪个),那么不,该语句没有任何问题。

答案 1 :(得分:2)

需要注意的一些事项。您似乎依赖于rowid为您的特定分组提供最早的行(选择min(rowid)...)。这并非总是如此。保证删除最早记录的唯一方法是使用您可以订购的某些列(如时间戳)。 Tom Kyte explains this比我更好。

  

rowid意味着物理位置以外的其他位置。   它并不意味着年龄,插入顺序或类似的东西。

此外,根据表的大小,您将生成大量重做/撤消,并且在大型表中使用pl / sql以块的形式删除并提交每x行可能是有益的。

只是我的想法