我正在尝试避免SQL中的相关子查询,但我似乎无法弄清楚如何做到这一点。这是我目前的PostgreSQL声明:
INSERT INTO book_collection (publisher, p_key, collection_name, page_number)
(SELECT publisher,
p_key,
source,
pages
FROM db_publication_new AS d
WHERE d.type =
'book_collection'
AND (SELECT type
FROM db_publication_new
WHERE dblp_key = d.crossref)
= 'book');
所以基本上我有一个名为db_publication_new
的表,它包含各种类型的发布,其中两个称为book_collection
和book
。无论类型如何,每个publication
都有一个名为crossref
的列,其中包含p_key
。此p_key
本身指的是同一数据库中的另一个publication
。
我希望获得此表中book_collection
类型为crossref
的所有book
个出版物。我该如何有效地做到这一点?
我只能编写上面的低效语句,并且由于我表中的记录数量太长而无法完成。如何使语句不包含相关子查询?
答案 0 :(得分:2)
试试这个
INSERT INTO book_collection (publisher, p_key, collection_name, page_number)
VALUES
(SELECT d1.publisher,
d1.p_key,
d1.source,
d1.pages
FROM db_publication_new AS d1, db_publication_new AS d2
WHERE d1.type = 'book_collection'
AND d2.dblp_key = d1.crossref
AND d2.type = 'book');