2013-02-22 110 views
1

我试图避免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_collectionbook的出版物。每个publication(不论​​何种类型)都有一个名为crossref的列,其中包含p_key。这p_key本身是指在同一个数据库内的另一个publication

我想获得此表格中所有book_collection出版物的crossref类型book。我如何有效地做到这一点?

我只能写上面的低效率语句,并且由于表中的记录数量太长,无法完成。我如何使声明不包含相关的子查询?

回答

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'); 
+0

伟大的工作,谢谢。 – Michael 2013-02-22 12:53:32

+0

欢迎:)...表现更好吗? – Meherzad 2013-02-22 12:55:35

+0

好得多。大概在2到3秒内完成,而在10分钟后我放弃了。 – Michael 2013-02-22 13:02:55