什么是oracle中的max(rowid)

时间:2018-06-07 21:20:44

标签: sql oracle

以下查询是删除SALES_DETAILS中的重复行,但max(rowid)是什么?

delete SALES_DETAILS
  where rowid not in (select max(rowid)
                      from sales_details
                      group by txt_id,customer_id);

2 个答案:

答案 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