2015-04-03 68 views
0

附上的图像具有两个表表1和表2如何使用光标删除重复条目

表1:

+-------------------------------------------------+--+ 
| First_name Last_name Date_of_birth Customer_ID | | 
+-------------------------------------------------+--+ 
| --------- --------- ---------  ------- | | 
| Anmol  Sharma 12/SEP/1988  A101  | | 
| Anmol  Sharma 12/SEP/1988  A102  | | 
| Pushkar  Gupta  03/feb/1987  A103  | | 
| Pushkar  Gupta  03/Feb/1987  A104  | | 
+-------------------------------------------------+--+ 

表2:

First_name Last_name Date_of_birth Customer_ID Updated_timestamp 
---------  --------- -------------- ------------ --------------- 
Anmol   Sharma  12/SEP/1988  A101  23/Feb/2015 
Anmol   Sharma  12/SEP/1988  A102  24/FEb/2015 
Anmol   Sharma  12/SEP/1988  A101  25/Feb/2015 
Pushkar   Sharma  03/FEB/1987  A104  12/Jan/2015 

所需输出:

First_name Last_name Date_of_birth Customer_ID 
--------- --------- -------------- ------------ 
Anmol  Sharma  12/SEP/1988  A101 
Pushar  Sharma  03/FEB/1987  A104 

问:

我要保持近期更新CUSTOMER_ID(使用表2更新timestamp列)在表1和使用游标删除表1中的所有其他条目。 表格图像

有人可以请用光标解释逻辑。

+4

是oracle还是mysql?你需要使用游标还是查询很好? – fthiella 2015-04-03 21:18:32

+2

这是一种家庭作业吗?如果不是,则仅使用纯SQL(没有游标)会更好(更简单)。 – Dmitry 2015-04-03 21:30:07

+0

@fthiella我需要使用游标只 – 2015-04-04 08:25:24

回答

0
DELETE FROM table1 WHERE Customer_ID NOT IN 
(SELECT Customer_ID from table2 
GROUP BY Customer_ID 
ORDER BY Updated_timestamp DESC LIMIT 1); 
+0

我不能使用客户ID,如果它不是在GROUP BY语句 – 2015-04-03 21:34:51

+0

我明白了,感谢更新 – 2015-04-03 21:41:23

1

纯SQL将是:

delete from table1 
where customer_id in (
     select customer_id 
      from (select customer_id, 
         row_number() over 
          (partition by last_name, first_name 
          order by updated_timestamp desc) rn 
        from table2) t 
      where rn > 1) 

删除之前单独执行每个子查询,以确保它是正确的。在第一个子查询row_number()函数返回1为最近更新的行,2 - 为第二等。第二个子查询选择除最近(rn > 1)之外的所有ID,并且它是要删除的ID。

0

使用rowid伪列。

DELETE FROM your_table WHERE rowid not in (SELECT MIN(rowid) FROM your_table GROUP BY column1, column2, column3);

凡列1,列2和栏3弥补每条记录的标识键。您可能会列出所有列。