Проблемы с обходом коррелированного подзапроса

Я пытаюсь избежать коррелированного подзапроса в моем 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. Как мне сделать это эффективно?

Я смог написать только неэффективный оператор выше, и из-за количества записей в моей таблице это занимает слишком много времени. Как сделать так, чтобы выражение не содержало коррелированного подзапроса?


person Michael    schedule 22.02.2013    source источник


Ответы (1)


Попробуй это

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');
person Meherzad    schedule 22.02.2013
comment
Намного лучше. Закончил примерно через 2 или 3 секунды, в то время как раньше я сдавался через 10 минут. - person Michael; 22.02.2013