避免相关子查询的问题
问题描述:
我试图避免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
。我如何有效地做到这一点?
我只能写上面的低效率语句,并且由于表中的记录数量太长,无法完成。我如何使声明不包含相关的子查询?
答
试试这个
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');
伟大的工作,谢谢。 – Michael 2013-02-22 12:53:32
欢迎:)...表现更好吗? – Meherzad 2013-02-22 12:55:35
好得多。大概在2到3秒内完成,而在10分钟后我放弃了。 – Michael 2013-02-22 13:02:55