任何人都可以解释铅的工作原理吗?
DELETE table_name
WHERE rowid IN
( SELECT LEAD(rowid) OVER
(PARTITION BY key_values ORDER BY NULL)
FROM table_name );
另外我想知道ROWID
已经在这里使用了,但我觉得应该尽量避免使用rowid。使用rowid是正确的,它的后果是什么?
除了上述问题,如果我只触发子查询,我发现我得到了所有空值,然后它是如何获取重复记录的?
答案 0 :(得分:3)
以这种方式使用ROWID
没有任何问题。它们可以安全地在同一语句中使用。您不应该检索它,将其存储在某处然后重新使用存储的值,因为ROWID 可能更改一行(因此您可以获得与最初检索的行不同的行) - 但在一个语句中再次没关系。
我认为lead()
功能在这里使用不正确。它根据提供的顺序返回“下一行”的值。因此它将基本上返回表的所有rowid,除了“last”之外,因为它没有下一行。我猜这是你正在看到的NULL值。
因此该语句实际上会删除表中除最后一行之外的所有行(因为对于那一行,rowid将为null)。
我认为真正意图是从表中删除重复项。类似的东西:
DELETE table_name
WHERE rowid NOT IN (select min(rowid)
from table_name
group by key_values)