2013-02-22 1 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_collection и book. Каждый 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

+0

Добро пожаловать:) ... Это лучше в производительности? – Meherzad

+0

Гораздо лучше. Закончено примерно через 2 или 3 секунды, пока я не сдался через 10 минут. – Michael