【问题标题】:Any efficient solution for that任何有效的解决方案
【发布时间】:2019-06-30 08:24:46
【问题描述】:
  declare 


       cursor cur1 is select * from address where aid in
        (select Min(aid) from address group by
        country,state,city,street_name,locality,house_no);

       cursor cur2 is select * from address;


        cur1_aid                address.aid%type;
        cur1_country            address.country%type;
        cur1_city               address.city%type;
        cur1_state              address.state%type;
        cur1_streetAddress      address.street_name%type;
        cur1_locality           address.locality%type;
        cur1_houseNo            address.house_no%type;


        cur2_aid                address.aid%type;
        cur2_country            address.country%type;
        cur2_city               address.city%type;
        cur2_state              address.state%type;
        cur2_streetAddress      address.street_name%type;
        cur2_locality           address.locality%type;
        cur2_houseNo            address.house_no%type;



begin 
         open cur1;
            loop
            fetch cur1 into cur1_aid,cur1_country,cur1_state,cur1_city,cur1_streetAddress,cur1_locality,cur1_houseNo;
            exit when cur1%NOTFOUND;
                open cur2;
                    loop
                    fetch cur2 into  cur2_aid,cur2_country,cur2_state,cur2_city,cur2_streetAddress,cur2_locality,cur2_houseNo;
                    exit when cur2%NOTFOUND;
                        if(cur1_country=cur2_country) and (cur1_state=cur2_state) and (cur1_city=cur2_city) and (cur1_streetAddress=cur2_streetAddress) and (cur1_locality=cur2_locality) and (cur1_houseNo=cur2_houseNo) then
                            if (cur1_aid!=cur2_aid) then
                                    update employee_add set aid=cur1_aid where aid=cur2_aid;
                                    delete address where aid=cur2_aid;
                            end if;
                        end if;
                    end loop;
                close cur2;
            end loop;
        close cur1;
    DELETE FROM employee_add a
    WHERE ROWID > (SELECT MIN(ROWID) FROM employee_add b
    WHERE b.eid=a.eid and b.aid=a.aid
    );
    end;
    /

我有三个表 Employee(eid,ename) ,Address(aid,country,state,city,streetaddress,locality,houseNo) 和一个关系表 (M2M) MANY TO MANY TABLE employee_add(eid,aid),

我想从地址表和employee_add 表中删除重复项而不丢失数据

【问题讨论】:

  • 所以这是基于the answer to your previous question on the subject。 (是的,删除您的用户帐户并没有删除您的问题。)该解决方案有什么问题?请定义您所说的“有效解决方案”是什么意思。
  • 实际上有人告诉我这会起作用,但这段代码效率不高,不知道如何改进......

标签: oracle plsql duplicates


【解决方案1】:

假设这是一次重复数据删除,您可以:

  1. 根据附加到员工的当前地址创建一组新的临时 eid 援助关系,并始终选择具有匹配数据的最小地址记录(这就是您在上面所做的)
  2. 删除现有的 eid 援助关系
  3. 从第 1 步插入新关系,删除第 1 步数据
  4. 删除不再有任何员工的地址

类似的东西(未经测试,因为您没有提供任何 DDL 或 DML 来创建工作示例):

-- Step 1
CREATE TABLE employee_add_new AS
  SELECT ea.eid,
         (SELECT MIN(a2.aid)
            FROM address a2
           WHERE a2.country = a.country
             AND a2.state = a.state
             AND a2.city = a.city
             AND a2.street_name = a.street_name
             AND a2.locality = a.locality
             AND a2.house_no = a.house_no) AS aid
    FROM employee_add ea
   INNER JOIN address a
      ON a.aid = ea.aid;

-- Step 2
TRUNCATE TABLE employee_add;

-- Step 3
INSERT INTO employee_add
  (eid,
   aid)
  SELECT eid,
         aid
    FROM employee_add_new;

DROP TABLE employee_add_new;

-- Step 4
DELETE FROM address a
 WHERE NOT EXISTS (SELECT NULL
          FROM employee_add ea
         WHERE ea.aid = a.aid);

您还可以更改第 2 步和第 3 步以删除现有的employee_add 表并将employee_add_new 重命名为employee_add,但我不知道您的表结构是什么样的(列、FK、索引等)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-25
    • 2021-05-06
    • 2015-09-12
    • 2012-10-20
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    • 2012-03-25
    相关资源
    最近更新 更多