SQL交叉应用计数
我试图在SQL中使用SQL交叉应用计数,sql,sql-server-2005,Sql,Sql Server 2005,我试图在SQL中使用交叉应用,但只想在返回的行数大于1时使用调用的结果 我有以下SQL: INSERT INTO @dest (val1, val2, val3) SELECT t2.crossVal, t2.crossVal2, t1.tempVal FROM @tempTable t1 CROSS APPLY dbo.TableValuedFunction(t1.IDColumn) t2 在某些情况下,交叉应用返回多行,但绝大多数返回一行(因为所有
交叉应用
,但只想在返回的行数大于1时使用调用的结果
我有以下SQL:
INSERT INTO @dest (val1, val2, val3)
SELECT t2.crossVal, t2.crossVal2, t1.tempVal
FROM @tempTable t1
CROSS APPLY dbo.TableValuedFunction(t1.IDColumn) t2
在某些情况下,交叉应用
返回多行,但绝大多数返回一行(因为所有@tentable
行都有相应的函数结果)。我感兴趣的是只插入那些从交叉应用中得到多个对应结果的
我试图避免插入所有内容,然后再进行删除。我真的很想看看是否有任何类型的聚合操作可以应用于该语句
有什么想法吗
编辑:响应SQLMenage的回答。我得到以下结果,其中左列为tempVal,中间列为crossVal,右列为crossVal2:
a : 1 : z0
b : 1 : z0
a : 2 : z1
b : 2 : z1
c : 1 : z0
d : 1 : z0
我想去掉“c:1:z0”和“d:1:z0”两行。此外,它可能会影响分组,因此我将提到这一点,我的最终查询有两列从函数返回,一列从临时表返回
结束查询基本上是计算可诱惑行的父级,其中有多个父级(作为表从函数返回),我希望执行插入并记录父级的顺序(再次从函数返回)。crossVal是父ID,crossVal2是作为int的顺序。试试这个
INSERT INTO @dest (val1, val2)
SELECT t2.crossVal, t1.tempVal
FROM @tempTable t1
CROSS APPLY dbo.TableValuedFunction(t1.IDColumn) t2
GROUP BY t2.crossVal, t1.tempVal
HAVING COUNT(*) > 1
由于您希望根据cross aply返回的行数进行分组,因此我只将一个表达式放入group by中。这就是为什么您得到的是6行而不是4行:
INSERT INTO @dest (val1, val2)
SELECT t2.crossVal, t1.tempVal
FROM @tempTable t1
CROSS APPLY dbo.TableValuedFunction(t1.IDColumn) t2
GROUP BY t2.crossVal
HAVING COUNT(*) > 1
谢谢你。我尝试了它,它大大减少了返回的结果集,但是我认为它不完全有效-我已经修改了我的问题,以显示我得到的结果。