选择计数查询或计算列

时间:2011-10-12 21:33:06

标签: sql sql-server linq linq-to-sql

所以,我有两张桌子:

类别表

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

所以,问题。对我有什么好处?

1 个答案:

答案 0 :(得分: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