【问题标题】:How to delete duplicate entry using a cursor如何使用光标删除重复条目
【发布时间】:2015-06-08 23:48:26
【问题描述】:

附图有两个表表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

问题:

我必须在 table1 中保留最近更新的 Customer_ID(使用 table2 更新的时间戳列)并使用游标删除表 1 中的所有其他条目。 表格图片

谁能解释一下使用光标的逻辑。

【问题讨论】:

  • 是oracle还是mysql?你需要使用游标还是查询就可以了?
  • 这是一种家庭作业吗?如果没有,最好(更简单)只使用纯 SQL,不使用游标。
  • @fthiella 我只需要使用光标
  • @Dmitry 我想用 cusrsor,但是你能提供我的 sql,想看看逻辑

标签: mysql sql oracle11g oracle-sqldeveloper plsqldeveloper


【解决方案1】:

使用 rowid 伪列。

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

其中 column1、column2 和 column3 构成每条记录的标识键。您可以列出所有列。

【讨论】:

    【解决方案2】:

    使用纯 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) 之外的所有 IDs,并且要删除的是 ID。

    【讨论】:

      【解决方案3】:
      DELETE FROM table1 WHERE Customer_ID NOT IN 
      (SELECT Customer_ID from table2 
      GROUP BY Customer_ID 
      ORDER BY Updated_timestamp DESC LIMIT 1);
      

      【讨论】:

      • 如果客户 ID 不在 group by 语句中,我不能使用它
      猜你喜欢
      • 2010-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-10
      • 1970-01-01
      • 2018-06-15
      • 2015-03-21
      相关资源
      最近更新 更多