我正在开发一个SP,以逗号分隔的字符串作为输入获取已售出的产品ID。
限制 :
我有一个函数获取输入的逗号分隔字符串并返回一个表,其中包含每个id的行。
SELECT * FROM SplitStringIDsIntoTable(@ProductIDs,',')
然后,为了能够计算每件商品的商品成本(如果商品售出3次,我需要将其COG添加3次,不幸的是,获得一个新的输入告诉我数量是不可能的对于每个已售出的商品),我做了类似的事情:
SET x = (SELECT SUM(p.COG) FROM Products p WHERE p.ProductId IN
(SELECT * FROM SplitStringIDsIntoTable(@ProductIDs,',')))
但这里的问题是,我没有数量作为输入。 当我使用IN()语句时,它只按预期计算每个id一次。
例如,假设我卖的产品ID输入为'11,12,13,11,13'
我的sql语句是:
SET x = (SELECT SUM(p.COG) FROM Products p WHERE p.ProductId IN
('11,12,13,11,13'))
返回完全相同的结果:
SET x = (SELECT SUM(p.COG) FROM Products p WHERE p.ProductId IN
('11,12,13'))
没有给出正确的总数。 我正在寻找的是,是否有任何声明同时考虑重复值?
我不想使用While Loop。
PS:我不确定如何在标题中提出这个问题,所以问题标题可能看起来毫无意义。随意更新它。答案 0 :(得分:1)
使用JOIN
代替IN
:
SELECT @x = SUM(p.COG)
FROM Products p JOIN
dbo.SplitStringIDsIntoTable(@ProductIDs, ',') ss
ON p.ProductId = ss.ProductId;
答案 1 :(得分:1)
如果您有一个包含重复ID的列表,IN
将不会在JOIN
期间重复显示结果。例如:
Declare @List varchar(50)='10,11,12,11,11'
-- Using IN Returns
Select count(*)
From OD
Where [OD-Nr] IN (Select Key_Value from [dbo].[udf-Str-Parse](@List,','))
-- Using JOIN
Select count(*)
From [OD] A
Join (Select Key_Value from [dbo].[udf-Str-Parse](@List,',')) B on (Key_Value=A.[OD-Nr])
结果
IN返回3而JOIN返回5