麻烦避免相关子查询

时间:2013-02-22 12:40:49

标签: mysql sql postgresql correlated-subquery

我正在尝试避免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个出版物。我该如何有效地做到这一点?

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

1 个答案:

答案 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');