2011-04-17 35 views
1

你好,大家好,我有以下我的表關係子查詢,加入,而不是在SQL Server

enter image description here

和我寫在我的存儲過程

. Select useremail,fullname,city,[state], allowAlerts,allowLetters,aboutMe,avatar,dateregistered, 
      (Select COUNT(*) from blog_info where blog_info.userId = @userId)as blogCount, 
      (Select count(*) from blog_info where blog_info.isfeatured = 1 AND blog_info.userId = @userId)as featuredCount, 
      (Select COUNT(*) from blog_comments where blog_comments.userId = @userId)as commentsCount, 
      (Select COUNT(*) from forum where forum.createdby = @userId) as forumCount, 
      (Select COUNT(*) from forumresponse where forumresponse.userId = @userId)as responseCount 

      from user_info where _id = @userId. 

以下嵌套查詢我想用連接的查詢替換這個嵌套的查詢。

請幫助我做到這一點。

由於提前

+0

爲什麼你要轉換的加入? – Oded 2011-04-17 08:01:15

+1

由於性能問題。由於與子查詢相比,聯接的性能更強。 – Abhi 2011-04-17 08:02:32

+3

爲什麼你想用連接替換嵌套查詢?你希望獲得更高效的查詢嗎?我懷疑它會有幫助。加入用戶ID似乎並不適合這裏。 – Codo 2011-04-17 08:50:37

回答

1
select 
    u.useremail, 
    u.fullname, 
    u.city, 
    u.[state], 
    u.allowAlerts, 
    u.allowLetters, 
    u.aboutMe, 
    u.avatar, 
    u.dateregistered, 
    isnull(ub.blogCount,0) blogCount, 
    uf.featuredCount, 
    uf2.forumCount, 
    ur.responseCount 
from 
    user_info u 
left outer join 
    (select userid, count(*) blogCount from blog_info group by userid) ub on ub.userid = u._id 

(等做了類似的加入對每個子查詢你原本)

where 
    u._id = @userId 

對不起,我沒用格式!

注:查詢引擎可能是足夠聰明的使用相同的執行計劃,這兩個查詢,所以你不會看到任何改善

+0

如果您發佈代碼,XML或數據樣本,**請**在文本編輯器中突出顯示這些行,然後單擊編輯器工具欄上的「代碼樣本」按鈕(「{}」),以精確地格式化和語法突出顯示它!如果您發佈錯誤消息,請**使用blockquotes('「')正確格式化錯誤消息。 – 2011-04-17 10:54:18

1

您是否嘗試過粘貼查詢,並強調它在 查詢編輯器,然後單擊查詢設計器工具欄按鈕? Management Studio將在查詢設計器中打開查詢,並根據連接進行重寫。

+0

是的,我已經嘗試過,但不能獲得成功 – Abhi 2011-04-17 08:19:46

1

另一種方法是運行所有這些計數子查詢並存儲在單獨的SP變量中。你有沒有嘗試過,看看它是否比緩存等多個子查詢更有效?

+0

不,我認爲實施它的最好方法是通過使用連接,否則沒有用處PKK FK關係 – Abhi 2011-04-17 08:25:56

+0

是的,我絕對同意一個單一的加入查詢是首選,但我還沒有看到一個查詢與連接+計數每個連接的表,因爲你需要。我的意思是,如果你不能用連接來完成它,你可以嘗試單獨的查詢來將每個計數存儲在一個單獨的變量中。我會喜歡這個,因爲我也對解決方案感興趣。 Cheers – wired00 2011-04-17 09:08:02