代码之家  ›  专栏  ›  技术社区  ›  Adam Houldsworth

SQL交叉应用计数

  •  0
  • Adam Houldsworth  · 技术社区  · 14 年前

    我试着用 CROSS APPLY 在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
    

    在某些情况下返回多行,但绝大多数情况下返回一行(与所有行一样) @tempTable 行具有函数的相应结果)。我只想插入那些 相应的结果来自 交叉应用

    我正在尝试避免插入所有内容,然后再执行删除操作。我真的很想看看是否有任何类型的聚合操作可以应用到该语句。

    有什么想法吗?

    编辑: 为了回应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”行。另外,它可能会影响分组,所以我将提到这一点,我的最终查询有两个从函数返回的列和一个从temp表返回的列。

    结束查询基本上是统计可试探行的父级,其中有多个父级(作为表从函数返回)我想插入并记录父级的顺序(同样从函数返回)。crossVal是父ID,crossVal2是int的顺序。

    2 回复  |  直到 14 年前
        1
  •  1
  •   SQLMenace    14 年前

    试试这个

    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
    
        2
  •  1
  •   DarylChymko    13 年前

    因为您希望按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