查询删除临时表中的重复行
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 过滤行。
注意:如果您的数据中有除ACCESSED
和PENDING
之外的更多状态,则此查询可能不起作用。
【讨论】:
然后将插入第一个从而删除重复项【参考方案2】:最简单的解决方案是在填充主表时将它们过滤掉,而不是从临时表中删除重复行:
insert into Persons ( ID, Name, pan, Address,status)
select distinct ID, Name, pan, Address,status
from temptable
/
【讨论】:
对于名称SUNRAI
,temptable
中有两个状态。但是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”平移行数据。以上是关于查询删除临时表中的重复行的主要内容,如果未能解决你的问题,请参考以下文章