5

使用 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);
4

2 回答 2

9

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

如果您min(rowid)仅用于获取其中一个重复项(并且您不在乎哪个),那么不,该语句没有任何问题。

于 2012-07-19T16:53:28.170 回答
2

有几点需要注意。似乎您依赖于 rowid 为您的特定分组提供最早的行(选择 min(rowid) ...)。这并不总是正确的。保证您删除最早记录的唯一方法是使用您可以订购的某些列(如时间戳)。 汤姆凯特比我解释得更好。

rowid 意味着除了行的物理位置之外什么都没有。它并不意味着年龄、插入顺序或类似的东西。

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

只是我的想法

于 2012-07-19T16:48:53.050 回答