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

Posted

技术标签:

【中文标题】查询删除临时表中的重复行【英文标题】:Query for removing duplicates rows in temp table 【发布时间】:2017-04-11 07:10:25 【问题描述】:

我有两张桌子,一张是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
------------------------------------------------

【问题讨论】:

您使用的是 mysql 还是 Oracle?您是否尝试过四处寻找解决此问题的方法? 甲骨文:***.com/questions/529098/… ... MySQL:***.com/questions/2630440/… 如果temptable 中的特定Name 有2 行,其中1 行具有ACCESSED 状态,1 行具有PENDING 状态,ACCESSED 行是否应该出现在Persons 中桌子? 更一般地,请定义“重复数据”。如果status 可以在temptable 中变化,那么其他哪些列可能会有所不同?另外,为什么sUNRAI 的情况得到纠正,而sAI 的情况却没有得到纠正??? 在某些情况下,我可能会得到不同的状态,例如 ACCESSED 和 PENDING 在这种情况下,我只需要插入 ACCESSED pan 数据。 【参考方案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 之外的更多状态,则此查询可能不起作用。

【讨论】:

然后将插入第一个从而删除重复项【参考方案2】:

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

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

【讨论】:

对于名称SUNRAItemptable 中有两个状态。但是Persons 表中只有一行。 感谢您的帮助。上述场景(不同)解析相同的数据。但我还有一个问题。如果在这种情况下同一个平移包含不同的状态,如“已访问”和“待处理”,我只需要“已访问”平移行数据 然后使用utsav's solution【参考方案3】:

我猜你的主桌是人。

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

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

如果您希望将 pan 区分为不同的字符,请使用 distinct 函数与 pan。

【讨论】:

感谢您的帮助。上述场景(不同)解决了,但我还有一个问题。但是在这种情况下,同一个 pan 包含不同的状态,如“ACCESSED”和 PENDING,我只需要“ACCESSED”平移行数据。

以上是关于查询删除临时表中的重复行的主要内容,如果未能解决你的问题,请参考以下文章

如何从 DbVisualizer 中删除表中的重复行

如何删除表中的重复行[重复]

如何从 SQL Server 中的表中删除重复行 [重复]

Oracle 删除表中的重复行并使用另一个表中的值更新行

sql 删除表中的重复行

如何根据一个表中的特定值从3个表中删除行[重复]