Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在使用in()语句-TSQL进行计算时,是否可能包含重复的ID?_Sql_Tsql - Fatal编程技术网

在使用in()语句-TSQL进行计算时,是否可能包含重复的ID?

在使用in()语句-TSQL进行计算时,是否可能包含重复的ID?,sql,tsql,Sql,Tsql,我正在使用一个SP,它将销售的产品ID作为逗号分隔字符串作为输入 限制: 无法添加新输入 无法更改输入数据类型 我有一个函数,它获取输入的逗号分隔字符串,并返回一个表,其中包含每个id的一行 SELECT * FROM SplitStringIDsIntoTable(@ProductIDs,',') 然后,为了能够计算每件售出商品的成本(如果该商品售出3次,我需要将其COG添加3次,不幸的是,获得一个新输入来告诉我每件售出商品的数量是毫无疑问的),我做了如下操作: SET x = (SEL

我正在使用一个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循环


附:我不知道如何在标题中问这个问题,所以问题标题可能看起来毫无意义。请随时更新

使用
加入
而不是
中的

SELECT @x = SUM(p.COG)
FROM Products p JOIN
     dbo.SplitStringIDsIntoTable(@ProductIDs, ',') ss
     ON p.ProductId = ss.ProductId;

使用
JOIN
而不是
中的

SELECT @x = SUM(p.COG)
FROM Products p JOIN
     dbo.SplitStringIDsIntoTable(@ProductIDs, ',') ss
     ON p.ProductId = ss.ProductId;

如果您有一个ID重复的列表,
中的
不会复制结果,而
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])
结果


如果您有一个ID重复的列表,
中的
将不会复制结果,而
中的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

Thx,这一点我很感激,但我不得不删除(ProductID),然后它就工作了。否则我会得到:表值函数“SplitStringIDsIntoTable”不能有列别名。它的工作原理是这样的:从Products p JOIN dbo.SplitStringIDsIntoTable(@ProductIDs,,')ss中选择@x=SUM(p.COG)p.ProductId=ss.ProductId;Thx非常感谢,但我必须删除(ProductID),然后它才能工作。否则我会得到:表值函数“SplitStringIDsIntoTable”不能有列别名。它的工作原理是这样的:从Products p JOIN dbo.SplitStringIDsIntoTable(@ProductIDs,,')ss中选择@x=SUM(p.COG)p.ProductId=ss.ProductId;