2011-06-10 52 views
2

我想獲取與博客相關的人員列表。表[BlogAffiliates]有:SQL Server是否需要兩個查詢和一個函數效率問題

  • BlogID
  • UserID
  • Privelage

,如果與該博客相關的人有一個低於或等於privelage他們不能編輯[bit field canedit]

此查詢是這樣做的最有效的方法還是有更好的方法來獲取這些信息?

我不知道它是否可以在單個查詢中完成?

難道沒有以更聰明的方式進行轉換嗎?

declare @privelage tinyint 
select @privelage = (select Privelage from BlogAffiliates 
      where [email protected] and BlogID = @BlogID) 

select aspnet_Users.UserName as username, 
    BlogAffiliates.Privelage as privelage, 
     Convert(Bit, Case When @privelage> blogaffiliates.privelage 
        Then 1 Else 0 End) As canedit 
from BlogAffiliates, aspnet_Users 
where BlogAffiliates.BlogID = @BlogID and BlogAffiliates.Privelage >=2 
     and aspnet_Users.UserId = BlogAffiliates.UserID 
+0

它應該拼寫'privilege' .... – 2011-06-10 07:27:47

+1

我喜歡一個特權如何讓另一個人可以編輯信息片段的想法。基本上,如果您的特權*卡住了*,您*可以編輯*。 :) – 2011-06-10 08:42:27

回答

0

其中一些將取決於所涉及表的索引和大小。例如,如果您在查詢時查詢的代價最高,那麼它就是「BlogAffiliates.BlogID」列中的查詢,然後您可以選擇一個表變量,然後從那裏進行兩次計算。

不過,我想最有可能你所說的查詢可能是最接近最有效的。由於這兩個查詢,唯一可能的工作重複是您在「BlogAffiliates.BlogID」字段上搜索兩次。

0

您可以嘗試下面的查詢。

Select aspnet_Users.UserName as username, Blog.Privelage as privelage, 
Convert(Bit, Case When @privelage> Blog.privelage 
    Then 1 Else 0 End) As canedit 
From 
(
    Select UserID, Privelage 
    From BlogAffiliates 
    Where BlogID = @BlogID and Privelage >= 2 
)Blog 
Inner Join aspnet_Users on aspnet_Users.UserId = Blog.UserID 

按我的理解,你不應該使用表變量,如果你與其他表連接它。這可以降低性能。但是如果記錄較少,那麼你應該去做。您也可以使用本地臨時表用於此目的。

+0

再次使用Table變量,它依賴於涉及的索引,表的大小以及表變量中結果的大小。僅當表變量沒有建立索引(表變量可以定義一個可以創建索引的主鍵)時,表變量可以在聯接上變慢(er)。即使沒有索引,如果你的表變量不大,在內存中完成的「表掃描」工作實際上更快。特別是如果您正在使用的表和索引無法一直在內存中完全緩存。表變量降低性能是一個不正確的總括聲明。 – ExCodeCowboy 2011-06-10 18:10:13

+0

嗨Xenophile,在這裏,我們想建議其他人,表連接不會100%,只有百分之一,因爲我們有where子句。此外,我們在這裏使用Sub查詢來查詢表變量。它應該提高性能。 – Pankaj 2011-06-12 08:44:51