2017-04-11 36 views
-3

我有兩個表,一個是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 
------------------------------------------------ 
+0

您使用的是MySQL還是Oracle?你有沒有嘗試尋找解決這個問題的方法? –

+0

Oracle:http://stackoverflow.com/questions/529098/removing-duplicate-rows-from-table-in-oracle ... MySQL:http://stackoverflow.com/questions/2630440/how-to-delete -duplicates-on-a-mysql-table –

+0

如果'temptable'中的特定'Name'有兩行,一個帶有ACCESSED狀態,另一個帶有PENDING狀態,那麼ACCESSED行應該存在於'人'表? – Nitish

回答

0

我假設你的主表是人。

你想要一個查詢從可移動表中刪除重複值並插入到人員。從數據中可以發現如果id是鍵字段來標識表查詢應該是

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

,如果你想區分泛在你的表不是Temptable是id字段是不是因爲它的1重複的獨特價值作爲不同的角色,然後使用不同的功能與泛。

+0

謝謝你的幫助。上面的場景(不同的)解決了,但我仍然有一個問題。但同樣的平臺包含不同的狀態,如「ACCESSED」和PENDING,在這種情況下,我只需要'ACCESSED'平移行數據。 – user187621

0

而不是從臨時表中刪除重複的行最簡單的解決方案就是,當你填充主表將它們過濾出來:如果你使用順序

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

對於名稱'SUNRAI','temptable'中有兩個狀態。然而,「人」表中只有一行。 – Nitish

+0

@Nitesh - 好點。 – APC

+0

謝謝你的幫助。上面的場景(不同的)解決了相同的數據。但是我仍然有一個問題。如果同一個平臺包含不同的狀態,如'ACCESSED'和PENDING,我只需要'ACCESSED'盤行數據 – user187621

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 

通過,然後ACCESSED將首先顯示,然後PENDING。因此,row_number會爲組的第一條記錄提供seq = 1。

然後使用此seq = 1在插入之前過濾行。

注意:如果您在ACCESSEDPENDING以外的數據中擁有更多狀態,則此查詢可能不起作用。

+0

然後插入第一個,從而刪除重複 – Utsav