Sql 需要解释以下删除重复记录的查询

Sql 需要解释以下删除重复记录的查询,sql,oracle10g,Sql,Oracle10g,有人能解释一下铅是如何工作的吗 DELETE table_name WHERE rowid IN ( SELECT LEAD(rowid) OVER (PARTITION BY key_values ORDER BY NULL) FROM table_name ); 我还想知道这里已经使用了ROWID,但是我觉得应该尽量避免使用ROWID。使用rowid是否正确,其后果是什么 除了上面的问题,如果我只启动子查询,我观察到我得

有人能解释一下铅是如何工作的吗

DELETE table_name
WHERE  rowid IN
       ( SELECT LEAD(rowid) OVER
                (PARTITION BY key_values ORDER BY NULL)
         FROM   table_name );
我还想知道这里已经使用了
ROWID
,但是我觉得应该尽量避免使用ROWID。使用rowid是否正确,其后果是什么


除了上面的问题,如果我只启动子查询,我观察到我得到了所有空值,然后它如何获取重复记录?

这样使用
ROWID
没有什么错。它们可以安全地在同一语句中使用。您不应该检索它,将其存储在某个位置,然后重新使用存储的值,因为ROWIDs可能会更改某一行(因此您可以获得与最初检索到的行不同的行),但在一个语句中,这同样是可以的

我认为
lead()
函数在这里使用不正确。它根据提供的顺序返回“next”行的值。因此,它将返回表中除“最后一行”之外的所有rowid,因为它没有下一行。我猜这就是你所说的空值

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

我认为真正的意图是从表中删除重复项。比如:

DELETE table_name
WHERE rowid NOT IN (select min(rowid) 
                    from table_name 
                    group by key_values)

这样使用
ROWID
没有什么错。它们可以安全地在同一语句中使用。您不应该检索它,将其存储在某个位置,然后重新使用存储的值,因为ROWIDs可能会更改某一行(因此您可以获得与最初检索到的行不同的行),但在一个语句中,这同样是可以的

我认为
lead()
函数在这里使用不正确。它根据提供的顺序返回“next”行的值。因此,它将返回表中除“最后一行”之外的所有rowid,因为它没有下一行。我猜这就是你所说的空值

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

我认为真正的意图是从表中删除重复项。比如:

DELETE table_name
WHERE rowid NOT IN (select min(rowid) 
                    from table_name 
                    group by key_values)

lead()
函数比
min()
有一个优点:它处理多个重复项。每一行将生成下一行的
rowid
。这意味着子查询在运行时应该生成所有rowid,但每个组中第一行的rowid除外,即每个组不会返回一个rowid。外部查询将根据返回的集合删除具有rowid的行,这意味着不会删除每个组的一个rowid。看不出有任何错误。
lead()
函数比
min()
有一个优点:它处理多个重复项。每一行将生成下一行的
rowid
。这意味着子查询在运行时应该生成所有rowid,但每个组中第一行的rowid除外,即每个组不会返回一个rowid。外部查询将根据返回的集合删除具有rowid的行,这意味着不会删除每个组的一个rowid。看不出有什么不对的地方。