gpt4 book ai didi

sql - 需要 SQL Server 2008 中标量值函数的帮助

转载 作者:行者123 更新时间:2023-12-03 02:49:56 25 4
gpt4 key购买 nike

我需要有关此标量值函数的帮助。

我想要做的是返回我在 MaxValue 行 max(Value) AS MaxValue 上获得的值。

如果 ItemIdListPropertyId 存在,则查询有效,并且仅返回 1 个值,但我无法创建它的函数。

CREATE FUNCTION GetLpivMax 
(
-- Add the parameters for the function here
@ItemId int,
@ListPropertyId int
)
RETURNS int
AS
BEGIN
DECLARE @output INT;
WITH U AS (
SELECT i.Id AS ItemId,
lpiv.Value,
lp.Id AS ListPropertyId
FROM ListPropertyItemValues lpiv
JOIN ListPropertyItems lpi ON lpi lpi.Id = lpiv.ListPropertyItemId
JOIN ListProperties lp ON lp.Id = lpi.ListPropertyId
JOIN Items i ON i.Id = lpiv.ItemId)
SELECT @output = MAX(u.value)
FROM U u
WHERE u.listpropertyid = @ListPropertyId
AND u.itemid = @ItemId
GROUP BY u.listpropertyid, u.itemid

RETURN @output
END
GO

最佳答案

我已经对你的问题投了赞成票,但我不喜欢任何答案。您应该将代码更改为内联表值函数。这段代码每次都会被认为是程序性的,而且它只是一个查询。

我在 http://msmvps.com/blogs/robfarley/archive/2009/12/05/dangers-of-begin-and-end.aspx 上写过它,但我会很快解释你应该做什么:

CREATE FUNCTION GetLpivMax  
(
-- Add the parameters for the function here
@ItemId int,
@ListPropertyId int
)
RETURNS TABLE AS
RETURN (
SELECT MAX(lpiv.Value) as LpivMax
FROM ListPropertyItemValues lpiv
JOIN ListPropertyItems lpi ON lpi.Id = lpiv.ListPropertyItemId
JOIN ListProperties lp ON lp.Id = lpi.ListPropertyId
JOIN Items i ON i.Id = lpiv.ItemId
WHERE lp.id = @ListPropertyId
AND i.id = @ItemId
GROUP BY lp.id, i.id
);

现在像这样使用它:

SELECT ip.*, m.LpivMax
FROM ItemsAndProperties ip
CROSS APPLY
dbo.GetLpivMax(ip.ItemID, ip.ListPropertyID) m
;

如果您不想从数据集中消除行,可以使用 OUTER APPLY。您可以添加额外的聚合,如果您不引用它们,这些聚合将被完全忽略。但最重要的是,查询优化器将简化您的查询,因此,如果它可以避免做大量工作,它就会这样做。

希望这有帮助...

关于sql - 需要 SQL Server 2008 中标量值函数的帮助,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1967234/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com