我有两个表Book和Article如下,
我想按照以下方式复制每本书的所有文章,
但是为bookId 2(最后3行)重复了一些记录。
这是我的脚本。请建议替代解决方案。
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;
答案 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;
这将为ARTICLE
和ARTICLE
的每个组合在BOOK
中创建一个新行。我不确定这样做会有什么意义,但在技术层面上就是这样做的。
您可能还希望使用minus
或not exists
构造排除已存在的组合。