2015-04-03 60 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彌補每條記錄的標識鍵。您可能會列出所有列。