2010-09-23 86 views
0

我想在SQL中使用CROSS APPLY,但只希望使用调用的结果如果返回的行数大于1SQL跨应用伯爵

我有以下SQL:

INSERT INTO @dest (val1, val2, val3) 
SELECT   t2.crossVal, t2.crossVal2, t1.tempVal 
FROM  @tempTable t1 
CROSS APPLY dbo.TableValuedFunction(t1.IDColumn) t2 

CROSS APPLY在某些情况下返回多行,但绝大多数返回一行(因为所有的@tempTable行都有相应的函数结果)。我很有兴趣只插入那些有的复数对应的结果来自CROSS APPLY

我试图避免插入所有然后做删除事后。真的很感兴趣,看看是否有任何类型的聚合行为,我可以适用于该陈述。

任何想法?

编辑:回应SQLMenace的答案。我得到下面的结果,其中左列是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“。此外,它可能会影响分组,所以我会提到这一点,我的最终查询有两个从函数返回的列和一个来自临时表。

结束查询基本上是计数tempTable行的父节点,其中有多个父节点(作为函数中的表返回)我想要执行插入并记录父节点的顺序(再次从功能)。 crossVal是父级ID,crossVal2是int的顺序。

回答

1

试试这个

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 
+0

谢谢你。我试过了,它大幅减少了返回的结果集,但我认为它完全不起作用 - 我修改了我的问题以显示我得到的结果。 – 2010-09-23 15:22:35

1

既然你要组由交叉APLY返回的行数,我只会把一个表达到您的组通过。这就是为什么你得到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