2011-10-12 55 views
1

所以,我有2個表:選擇數查詢或計算列

分類表

Analit int 
PositionInMenu int 

項目表

Analit int 
CategoryAn int 

所以,我有大約50個類別和2000件物品。我需要考慮它包括的物品的每個類別數量。

1)SELECT *, (SELECT COUNT(Analit) FROM Item_table t2 WHERE t2.CategoryAn = t1.Analit) as tCount FROM Categories_table t1 ORDER BY PositionInMenu

2)添加到類別表計算列與函數調用:

([dbo].[Categories_GetItemsCountInCategory]([Analit])) 

和功能的代碼:

CREATE FUNCTION dbo.Categories_GetItemsCountInCategory 
    ( 
    @categoryId int = null 
    ) 
RETURNS int 
AS 
    BEGIN 
    RETURN (SELECT COUNT(Analit) 
      FROM Items 
      WHERE CategoryAn = @categoryId) 
    END 

,然後我可以簡單地採取加列的值到我的查詢:

SELECT * 
FROM Categories_table 
ORDER BY PositionInMenu 

所以,問題。什麼對我更好?

回答

4

在查詢中內聯數據訪問而不是標量UDF時,你總是更適合使用數據訪問。

查詢優化器不擴展標量(或多語句)UDF,因此您始終強制實施嵌套循環連接計劃,而不是允許它考慮替代方案。

你也可以考慮一個OUTER JOIN ... GROUP BY而不是相關的子查詢。

SELECT t1.*, 
     ISNULL(tCount, 0) AS tCount 
FROM Categories_table t1 
     LEFT JOIN (SELECT COUNT(Analit) AS tCount, 
         CategoryAn 
        FROM Item_table 
        GROUP BY CategoryAn) t2 
     ON t2.CategoryAn = t1.Analit 
ORDER BY PositionInMenu 
+0

的OP是在暗示計算列(配備了UDF) – Andomar

+0

@Andomar - 這將不會被允許作爲持久化計算列和非堅持我的回答仍然適用。這就像在查詢中直接引用UDF一樣。 –

+0

好,很好。但是,我使用LINQ和它生成SQL查詢,並不總是很乾淨。我的項目中有太多的LINQ,現在很難重新編寫乾淨的SQL查詢中的每個函數。 Mb後來,thx。 – FSou1