0

谁能解释一下铅在这里是如何工作的?

DELETE table_name
WHERE  rowid IN
       ( SELECT LEAD(rowid) OVER
                (PARTITION BY key_values ORDER BY NULL)
         FROM   table_name );

另外我想知道ROWID这里已经使用过,但是我觉得应该尽可能避免使用 rowid。使用rowid是否正确,它的后果是什么?

除了上述问题,如果我只触发子查询,我观察到我得到所有空值,那么它如何获取重复记录?

4

1 回答 1

3

使用ROWID这种方式没有任何问题。它们可以安全地在同一个语句中使用。您不应该检索它,将其存储在某处,然后重新使用存储的值,因为 ROWID可能会更改一行(因此您可以获得与最初检索到的不同的行) - 但再次在一个语句中这是可以的。

我认为该lead()功能在这里使用不正确。它根据提供的顺序返回“下一个”行的值。所以它基本上会返回表的所有 rowid,除了“最后一个”,因为它没有下一行。我想这就是你看到的 NULL 值。

因此,该语句实际上将删除表中除最后一行之外的所有行(因为对于该行,rowid 将为空)。

认为真正的目的是从表中删除重复项。就像是:

DELETE table_name
WHERE rowid NOT IN (select min(rowid) 
                    from table_name 
                    group by key_values)
于 2013-06-19T11:43:46.623 回答