2012-03-30 56 views
1

當創建報告,我發現自己經常加入到廣告典當子查詢是這樣的:與加入到廣告典當子查詢性能的擔憂

SELECT * FROM Customer c 
JOIN (SELECT CustomerId,ContractId FROM Contract WHERE StartDate > GetDate()) co ON co.CustomerId = c.CustomerId 

顯然,這僅僅是一個入住演示SQL,但它說明了點。 我想知道這些類型的查詢是否有一些性能問題。還有其他好的選擇嗎?通常情況下,子查詢是與骨料等多種複雜..

我知道在這種情況下,它會更有意義,只是加入直接接觸的表,但我只是想說明的總體思路,而不必提供令人費解的例子。

任何反饋將不勝感激:-) 這是一種常見的做法?

回答

1

不是迂腐,但這在技術上不是一個ad-hoc query,它將被定義爲由系統的最終用戶創建的查詢。相反,你的例子實際上只是一個子查詢。

要解決您的問題,如果您發現自己多次加入相同的子查詢,應該創建一個視圖,然後加入該視圖。這將允許您簡化代碼,並在將來對任何位置的子查詢進行更改。

如果您只在單個報表中使用這些子查詢,並且它們之間沒有任何通用的報表可以放在視圖中,那麼這只是編寫查詢的另一種方式。這並不罕見,但您可能會考慮其他方法,例如用更多的連接替換子查詢 - 這可能會爲您提供更好的執行計劃,但這會因其他幾個因素而有所不同,其中包括哪些RBDMS是爲了。

+0

是的,加入其他表通常是不實際的,但因爲我有時必須做聚合和其他技巧,很難用直接連接完成。我喜歡視圖的想法,但通常子查詢對於它們的使用是非常特定的,所以重用是非常有限的。可能是一個有名的子查詢可能是一個不錯的中間地帶。 – TGH 2012-03-30 04:35:15