Oracle PLSQL嵌套游标for循环问题:没有获得所需的结果

时间:2017-05-04 11:56:29

标签: sql oracle plsql

我有两个表Book和Article如下,

enter image description here

enter image description here

我想按照以下方式复制每本书的所有文章,

enter image description here

但是为bookId 2(最后3行)重复了一些记录。

enter image description here

这是我的脚本。请建议替代解决方案。

DECLARE
  CURSOR bookRecords IS SELECT ID FROM BOOK;
  CURSOR articleRecords IS SELECT ID,NAME,BOOK_ID FROM ARTICLE;
BEGIN
  FOR bookRecord IN bookRecords LOOP
    FOR articleRecord IN articleRecords LOOP 
       INSERT INTO ARTICLE (ID,NAME,BOOK_ID) VALUES (ARTICLE_ID_SEQ.nextVal, 
articleRecord.NAME, bookRecord.ID);
    END LOOP;
  END LOOP;
  EXECUTE IMMEDIATE 'DELETE FROM ARTICLE WHERE BOOK_ID IS NULL';
  COMMIT;
END;

2 个答案:

答案 0 :(得分:4)

你不应该使用游标。只是cross join,它将两个表中的每一行组合在一起,完全符合您的要求。

您可以插入此语句的基础,但根据您要完成的任务,我认为您应该插入新表而不是现有的文章表。因为这会保留现有的表格,只列出文章(最有可能的一件事)。

insert into new_combined_book_article_table (id, name, book_id)
   select row_number() over (order by books.id),articles.name,books.id 
      from books 
      cross join articles

答案 1 :(得分:2)

不仅仅是:

insert into article
     ( id
     , name
     , book_id )
select article_id_seq.nextval
     , a.name
     , b.id
from   article a cross join book b;

这将为ARTICLEARTICLE的每个组合在BOOK中创建一个新行。我不确定这样做会有什么意义,但在技术层面上就是这样做的。

您可能还希望使用minusnot exists构造排除已存在的组合。