从表行号分区中删除重复的行

时间:2017-11-13 12:18:59

标签: sql oracle duplicates sql-delete window-functions

每个<ul class="pagination"> <?php $search_str = ''; if ($search) { $search_str = "&search=" . urlencode($search); } for ($i = 1; $i <= $total_page; $i++) echo "<li class='" . ($page_id == $i ? 'active' : '') . "'><a href='index.php?page=" . $i . $search_str . "'>$i</a></li>"; ?> </ul> 删除重复项:

我必须编写一个通用com_id来删除世界末尾的vald记录(DELETE) 如果:

  • tar_id = -1
  • vald_from = 0001-01-01
  • 这个com_id的另一条记录是vald_to = 9999-01-01

查询是:

vald_to = 9999-01-01

该脚本删除com_id

的所有记录

2 个答案:

答案 0 :(得分:0)

你可以使用rowid,这个delete为我工作:

delete from c
  where rowid in (
    select rwd 
      from (
        select rowid rwd, 
               row_number() over (partition by com_id order by null) dup
          from c
          where tar_id = -1 
            and vald_from = date '0001-01-01'
            and vald_to   = date '9999-01-01' )
      where dup > 1 );

答案 1 :(得分:0)

我真的不明白你认为你想删除的副本。所以只是猜测:当你的范围被另一条记录覆盖时,你正在考虑重复记录。 E.g:

COM_ID   vald_from    vald_to
123      0001-01-01   9999-01-01
123      0001-01-01   2017-01-01

第二个记录是多余的,因为它的范围只是第一个记录的较大范围的一部分。但同样的情况也是如此:

COM_ID   vald_from    vald_to
123      2016-01-01   2017-01-01
123      2016-02-01   2016-03-01

同样,第二个记录的范围只是第一个记录的一部分。

删除那些多余记录的查询将是:

delete from c
where exists
(
  select *
  from c other
  where other.com_id = c.com_id
  and other.vald_from <= c.vald_from
  and other.vald_to >= c.vald_to
  and other.rowid <> c.rowid
)
and tar_id = -1;

我不知道,你是否也想在子查询中使用tar_id = -1。也许你仍然想以某种方式限制日期date '0001-01-01'date '9999-01-01'。如果是,请相应地调整声明。