Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.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
SQL交叉应用计数_Sql_Sql Server 2005 - Fatal编程技术网

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 在某些情况下,交叉应用返回多行,但绝大多数返回一行(因为所有

我试图在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
在某些情况下,
交叉应用
返回多行,但绝大多数返回一行(因为所有
@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

谢谢你。我尝试了它,它大大减少了返回的结果集,但是我认为它不完全有效-我已经修改了我的问题,以显示我得到的结果。