查询删除临时表中的重复行

时间:2017-04-11 07:10:26

标签: mysql database oracle plsql rows

我有两个表,一个是temptable,另一个是Persons。我需要从下面删除temptable中的重复数据。

表一:

CREATE TABLE temptable 
  ( ID int, 
    Name varchar(255), 
    pan varchar(255), 
    Address varchar(255),
    status varchar(255) );

表二:

CREATE TABLE Persons ( 
        ID int, 
         Name varchar(255), 
        pan varchar(255), 
          Address varchar(255),
        status varchar(255) );

temptable中的数据有重复:

-----------------------------------------------------------
ID   Name            pan            Address        status 
-----------------------------------------------------------
1    Gopal       akkoso232l        hyd           ACCESSED
1    Gopal       akkoso232l        hyd           ACCESSED
2    sAI         aaa1213           VIZ           PENDING
3    RAM         LLWELW1213        hyd           ACCESSED
4    ONE         ONE12so232l       CHN           ACCESSED
5    REDDY       aZZoWE232l        TOW           ACCESSED
----------------------------------------------------------

6    sUNRAI      akppg8732        hyd           ACCESSED
6    sUNRAI      akppg8732        hyd           PENDING

-----------------------------------------------

我需要如下的主表数据(没有重复):

人员:

------------------------------------------------
ID  Name     pan            Address  status 
------------------------------------------------
1   Gopal    akkoso232l      hyd     ACCESSED 
2   sAI      aaa1213         VIZ     PENDING
3   RAM      LLWELW1213      hyd     ACCESSED
4   ONE      ONE12so232l     CHN     ACCESSED
5   REDDY    aZZoWE232l      TOW     ACCESSED
------------------------------------------------
6   SUNRAI   akppg8732       hyd     ACCESSED
------------------------------------------------

3 个答案:

答案 0 :(得分:1)

试试这个

insert into persons ( ID, Name, pan, Address,status)
select ID, Name, pan, Address,status 
from 
(
select t.*
,row_number over (partition bu id,name,pan,address order by status) as seq
from temptable
)
where seq=1

如果您使用order by,则会先显示ACCESSED,然后再显示PENDING。因此row_number将为该组的第一个记录提供seq = 1。

然后使用此seq = 1在插入之前过滤行。

注意:如果除了ACCESSEDPENDING之外,您的数据中的状态更多,则此查询可能无效。

答案 1 :(得分:0)

而不是从临时表中删除重复的行,最简单的解决方案就是在填充主表时过滤掉它们:

insert into Persons ( ID, Name, pan, Address,status)
select distinct ID, Name, pan, Address,status
from temptable
/

答案 2 :(得分:-1)

我认为你的主桌是人。

您希望查询从temptable表中删除重复值并插入到人员中。根据您的数据,您发现表temptable中的id字段不是唯一的,因为它具有重复值1.如果id是标识表查询的关键字段应该是

    insert into persons 
    select distinct(id),name,pan,address,status
    from temptable;

如果你想将pan区分为不同的字符,那么请使用pan的独特功能。