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。看不出有什么不对的地方。