DELETE FROM JDMOV_M001 WHERE JDMOV_M001.DISK_ID IN (SELECT DISK_ID FROM JDMOV_M001 WHERE JDMOV_M001.MOVIE_ID = 'help1');
 
DELETE FROM JDMOV_V001 WHERE JDMOV_M001.DISK_ID IN (SELECT DISK_ID FROM JDMOV_M001 WHERE JDMOV_M001.MOVIE_ID = 'help1');
一样的sql;DELETE FROM JDMOV_M002 WHERE JDMOV_M002.MOVIE_ID = 'help1';
 
SELECT DISK_ID FROM JDMOV_M001 WHERE JDMOV_M001.MOVIE_ID = 'help1';
是什么意思?

解决方案 »

  1.   

    DELETE FROM JDMOV_M002 WHERE JDMOV_M002.MOVIE_ID = 'help1';
    DELETE FROM JDMOV_V001 WHERE JDMOV_M001.DISK_ID IN (SELECT DISK_ID FROM JDMOV_M001 WHERE JDMOV_M001.MOVIE_ID = 'help1');
    你的意思是用一条DELETE语句同时执行上面这两步操作?一个SQL语句对两个不同表进行DELETE?
      

  2.   

    create or replace procedure delete_2_table
    begin
      DELETE FROM JDMOV_M002 WHERE JDMOV_M002.MOVIE_ID = 'help1';
      DELETE FROM JDMOV_V001 
       WHERE JDMOV_M001.DISK_ID IN 
        (SELECT DISK_ID FROM OV_M001 WHERE JDMOV_M001.MOVIE_ID = 'help1');
      commit;
    end;以后每次你只要执行下句就可以同时完成上述操作。
    execute delete_2_table;
      

  3.   

    create or replace procedure delete_2_table
    begin
      DELETE FROM JDMOV_M002 WHERE JDMOV_M002.MOVIE_ID = 'help1';
      //此处追加一行
      DELETE FROM JDMOV_M001 WHERE JDMOV_M001.MOVIE_ID = 'help1';  DELETE FROM JDMOV_V001 
       WHERE JDMOV_M001.DISK_ID IN 
        (SELECT DISK_ID FROM JDMOV_M001 WHERE JDMOV_M001.MOVIE_ID = 'help1');
      commit;
    end;以后每次你只要执行下句就可以同时完成上述操作。
    execute delete_2_table;
      

  4.   

    没错。我的意思就是先删除JDMOV_M002中指定的MOVIE_ID号,然后查询JDMOV_M001中该MOVIE_IDD的对应DISK_ID号,将查询出来的DISK_ID号删除,然后再把JDMOV_V001中这些DISK_ID号也删除。
    整个过程结束。
      

  5.   

    DELETE FROM JDMOV_V001 WHERE JDMOV_V001.DISK_ID IN (SELECT DISK_ID FROM JDMOV_M001 WHERE JDMOV_M001.MOVIE_ID = 'help1');
      

  6.   

    DELETE FROM JDMOV_V001 WHERE JDMOV_V001.DISK_ID IN (SELECT DISK_ID FROM JDMOV_M001 WHERE JDMOV_M001.MOVIE_ID = 'help1');这个语句执行效率很低的
    在强调效率的情况下
    应当把这个语句改写为存储过程
    CURSOR C1 IS 
        SELECT DISK_ID 
        FROM JDMOV_M001 
        WHERE MOVIE_ID = 'help1';BEGIN 
        FOR I IN C1 
        LOOP
            DELETE FROM JDMOV_V001 WHERE DISK_ID = I.DISK_ID;
        END LOOP;
    ;
    在这种批量更新的情况下,因为删除语句都是相同的格式:
    DELETE FROM JDMOV_V001 WHERE DISK_ID = XXX
    所以,oracle的优化器会使用共享池中的编译方案,只需编译将该语句编译一次
    就可以重复使用,从而使执行效率大大提高
    这就是所谓的“绑定变量”(似于jdbc中的PrepareStatement)