0

我有一张 TPAIE 表,2 条信息:

  • numben(受益人编号)
  • datPai(我付钱给他的日期)

通常一次约会,我必须有一个受益人(我付钱给那个人一次约会)。尽管如此,我有几行具有相同的受益人和相同的日期

    COUNTING NUMBEN   PERPAI 

     9 75005100 01/08/13 
     9 75005109 01/08/13 

我怎么能删除所有的行,但每个受益人和特定日期的行除外?

注意:我发现了类似的东西,但如果我只有一个标识符,它就可以工作

delete from tpaie where numben not in 
(select min(numben) from tpaie group by numben, perpai);

注意 2:我发现这个 sql 可以删除多次存在的所有行:我只是说'不要删除第一个)。某处的rownum?

delete from tpaie a 
where (numben, perpai) in (
select numben, perpai from tpaie b where b.rowid <> a.rowid)      
4

2 回答 2

2

第二次尝试时,您离目标很近。您只需要了解这rowid是唯一物理表行标识符的保留字。查看文档以了解更多信息。

询问:

delete tpaie 
where rowid not in (
  select distinct
    ( first_value(rowid) over (
        partition by numben, perpai order by rowid
      )
    ) first_row_id
  from 
    tpaie
)

您可以在此 SQLFiddle中看到完整的测试。

更新
@mlwacosmos 发现了一个性能更好的变体。当然,not in在原始答案中并不是一个好习惯。因此,我也添加了他的变体以供将来参考:

delete from tpaie a 
where 
  rowid not in ( 
    select distinct 
      ( first_value(rowid) 
          over (partition by numben, perpai order by rowid) 
      ) first_row_id 
    from 
      tpaie b 
    where 
      a.numben = b.numben 
      and 
      a.perpai = b.perpai 
  ) 
  and 
  (numben, perpai) in ( select numben, perpai 
                        from tpaie b 
                        where b.rowid <> a.rowid 
                      )

SQLFiddle

但是这个解决方案又涉及到not in了,所以最好使用in带有另一个分析排名的函数:

delete from tpaie a 
where 
  rowid in ( 
    select row_id 
    from (
      select 
        rowid row_id, 
        ( dense_rank() over ( -- enumerate rows
            partition by numben, perpai order by rowid
          )
        ) row_rank
      from 
        tpaie
    )  
    where
      row_rank > 1 -- eliminate rows ranked first
  )

SQLFiddle

于 2013-07-26T17:16:15.853 回答
0

使用 DISTINCT 创建一个临时表,以便每个本、每个日期仅获取一个条目,删除主表中的所有条目并使用临时表重新加载它,例如:

SELECT DISTINCT numben, perpai 
INTO #temp
FROM tpaie

DELETE FROM tpaie

INSERT INTO tpaie
SELECT * FROM #temp

编辑 :

对于特定日期,请尝试:

SELECT DISTINCT numben, perpai 
INTO #temp
FROM tpaie
WHERE perpai = '01/08/13'

DELETE FROM tpaie
WHERE perpai = '01/08/13'

INSERT INTO tpaie
SELECT * FROM #temp
于 2013-07-26T16:37:03.870 回答