所以,我有两张桌子:
类别表
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
所以,问题。对我有什么好处?
答案 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