【问题标题】:My code takes too much time for execution is there any efficient way to do this我的代码执行时间太长有没有有效的方法来做到这一点
【发布时间】:2019-02-01 11:07:01
【问题描述】:

这里有 3 张桌子 1.employee(eid,ename), 2.地址(援助,地址), 3.employee_add(eid,aid)

employee 和 address 中存在多对多关系。我需要做的是从 address 表中清除重复项,而不会从 employee_add 表中丢失任何数据。提前致谢!请帮忙

   DECLARE
         a ADDRESS.AID%TYPE;
         b ADDRESS.ADDRESS%TYPE;
         c ADDRESS.AID%TYPE;
         d ADDRESS.ADDRESS%TYPE;
         CURSOR Cur1 IS
          SELECT AID,ADDRESS
          FROM ADDRESS;
          CURSOR Cur2 IS
            SELECT AID,ADDRESS
             FROM ADDRESS;
      BEGIN
        OPEN Cur1;
         LOOP
            FETCH Cur1 INTO a, b;
            EXIT WHEN Cur1%NOTFOUND;
            OPEN Cur2;
            LOOP
            FETCH Cur2 into c,d;
            IF (b=d) THEN
                IF(a!=c) THEN
                    update  employee_add set aid=a where aid=c;
                    delete from address where aid=c;
                END IF;
                END IF;
                END LOOP;
                CLOSE Cur2;
                END LOOP;
                CLOSE Cur1;

                 END;

【问题讨论】:

  • 那么您会在employee_add 表中重复行吗?例如。如果 eid= 1 有 3 个重复的地址,那么您最终会在 employee_add 中得到 3 行具有相同 eid 和帮助的行。这有意义吗,还是我们也应该从employee_add 中删除重复的行?
  • 显示每个表中的一些示例行,并告诉我们您想要实现的具体目标。看起来,您只需要纯 SQL 中的简单 DML 语句。但是,示例数据将极大地帮助我们进行测试并为您提供可行的解决方案。
  • [员工表:1---amar 2-virat 3---aaditya] ,,,,,,,, [地址表--101--banglore 102---banglore 103- ---banglore 104----patna 105----patna 106---patna 107--patna 108---pune 109--pune ] .......... [employee_address 表 1- -101 1---102 1---103 1---107 2--101 2--102 2---105 3--102 3---108] 我想要的是---地址表[ 101---banglore 104----patna 108---pune] 和employee_address[1--101 1--104 2--101 2--104 3--101 3--108] 我已经给出了代码它显示相同的结果,即使地址表是参考下面的答案 nt 工作帮助
  • 这是代码stackoverflow.com/a/54485061/11000599 它正在工作但没有显示我想要的我留下了重复的部分请帮助

标签: plsql plsql-package


【解决方案1】:

您应该能够使用以下 SQL 语句(如果您愿意,可以将其放入 PL/SQL 过程中)来执行此操作,如下所示:

-- To update the employee_add tables
MERGE INTO employee_add tgt
  USING (SELECT ea.rowid rid,
                a.aid,
                a.address,
                MIN(aid) OVER (PARTITION BY address) new_aid
         FROM   address a
                INNER JOIN employee_add ea ON ea.aid = a.aid) src
  ON (tgt.rowid = src.rid)
WHEN MATCHED THEN
  UPDATE SET tgt.aid = src.new_aid
  WHERE tgt.aid != src.new_aid;

-- Delete any rows now longer in the employee_add table
DELETE FROM address
WHERE aid NOT IN (SELECT aid FROM employee_add);

-- If you need to deduplicate the employee_add table, this should do the trick:
DELETE FROM employee_add ea1
WHERE ROWID > (SELECT MIN(ROWID)
               FROM   employee_add ea2
               WHERE  ea1.eid = ea2.eid
               AND    ea1.aid = ea2.aid;

【讨论】:

    【解决方案2】:

    一般来说,显式游标比隐式游标慢。 您可以尝试转换

    OPEN ...
        LOOP 
            FETCH ... 
            EXIT WHEN ... 
            ...
            ...
        END LOOP;
    

    进入

    FOR ... LOOP 
        ... 
     END LOOP;
    

    否则,如果您提供一些 DDL 和 DML(连同 PK、索引和约束)会有所帮助。

    【讨论】:

      猜你喜欢
      • 2014-04-13
      • 1970-01-01
      • 1970-01-01
      • 2013-02-16
      • 1970-01-01
      • 1970-01-01
      • 2019-07-01
      相关资源
      最近更新 更多