2013-02-22 112 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