下面的查询是删除SALES_DETAILS中的重复行,但是max(rowid)是什么?
delete SALES_DETAILS
where rowid not in (select max(rowid)
from sales_details
group by txt_id,customer_id);
发布于 2018-06-08 05:30:39
ROWID
是Oracle的伪列,它保存特定行的地址。它让数据库定位行。您通常不会在表结构中看到它,但它就在那里并保持隐藏状态。这并不意味着你不能使用它:-)
您的DELETE语句删除了表SALES_DETAILS中基于txt_id, customer_id
对的重复行,就像您提到的那样。因此,这意味着它删除了重复项,但保存了组中rowid值最高的行。
请在documentation中查找它以获取更多信息。
发布于 2018-06-08 08:41:34
假设(通常)我们拥有的主要是“好的”数据,而不是很多重复的数据,那么移除它们可能会更有效地实现,方法是反转一下,找出重复的rowid,而不是不重复的,例如
delete from SALES_DETAILS
where rowid in (
select rid
from (
select rowid rid,
row_number() over ( partition by txt_id,customer_id order by rowid ) as r
from SALES_DETAILS
)
where r > 1
)
这里也有一段视频解释了这一点
https://www.youtube.com/watch?v=Y_m39BySTDU&list=PLJMaoEWvHwFIUwMrF4HLnRksF0H8DHGtt&index=19
https://stackoverflow.com/questions/50750329
复制相似问题