以下查询是删除SALES_DETAILS中的重复行,但max(rowid)是什么?
delete SALES_DETAILS
where rowid not in (select max(rowid)
from sales_details
group by txt_id,customer_id);
答案 0 :(得分:3)
ROWID
是Oracle的伪列,它包含特定行的地址。它允许数据库定位行。你通常不会在表结构中看到它,但它在那里并且仍然是隐藏的。但这并不意味着你不能使用它: - )
您的DELETE语句会删除基于txt_id, customer_id
对的表 SALES_DETAILS 中的每一行,就像您提到的那样。所以这意味着它会删除重复项,但会保存组中具有最高rowid值的行。
请在documentation查询以获取更多信息。
答案 1 :(得分:1)
假设(通常)我们主要拥有“好”数据并且没有多少重复数据,那么通过翻转它可以更有效地实现删除它们来挑选 重复,而不是不重复,例如
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