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