2014-01-05 63 views
0

我想調整查詢中具有IN子句的SQL查詢。調整SQL查詢,(查詢優化)

我試着用Join來替換IN並查看了查詢計劃。兩者在執行時間看起來都差不多,但結果卻不同。可以有人幫我解決這個問題嗎? 我正在使用pgadmin III中的商店數據庫。 在此先感謝。 原始查詢:

SELECT person.id 
FROM SHOP.person 
WHERE person.id IN (SELECT personid 
        FROM SHOP.contactperson 
        WHERE companyid = 5); 

SELECT person.id 
FROM SHOP.person 
     JOIN SHOP.contactperson 
     ON person.id = contactperson.id 
WHERE contactperson.companyid = 5; 

編輯:現在這個查詢返回正確的結果:

SELECT person.id 
FROM SHOP.person 
     JOIN SHOP.contactperson 
     ON person.id = contactperson.personid 
WHERE contactperson.companyid = 5; 

我用contactperson.id代替contactperson.id,當我將其更改爲正確的查詢,它給了我正確的結果。

+2

性能調優是**高度特定供應商的** - 我們需要知道** **(和版本),你用什麼具體的數據庫。 SQL只是查詢語言 - 絕大多數關係數據庫系統使用的是...... –

+0

@marc_s它是一個商店數據庫,我在pgadmin III中使用它。 –

+1

請顯示您的表結構,包括索引和查詢計劃。 –

回答

2
SELECT pe.id 
FROM SHOP.person pe 
WHERE EXISTS (
    SELECT *  
    FROM SHOP.contactperson cp 
    WHERE cp.personid = pe.id 
    AND cp.companyid = 5 
    ); 
+0

我已經檢查過您的建議查詢和Darhazer建議的查詢的執行計劃,它們是相同的。在什麼情況下,這個查詢可以更好地執行由Darhazer建議的另一個解決方案? –

+0

他們不同。如果人與接觸者之間存在1:N關係(我期望,但是你沒有讓我們獲得數據模型),Darhazer的查詢將產生每人多於一行,而我的數據只有一行。 – wildplasser

1

您的連接子句與您的原始查詢不使用相同的字段。您應該使用contactperson表中的personid。

SELECT person.id 
FROM SHOP.person 
Join SHOP.contactperson 
ON person.id = contactperson.personid 
WHERE contactperson.companyid = 5; 
+2

如果'contactperson.personid'不唯一,這仍然可以返回不同的結果。 –