SQL:使用COUNT(*)而不是EXISTS

是否可以使用COUNT代替EXISTS?

我有以下查询:

SELECT * 
FROM Goals G
WHERE EXISTS (SELECT NULL FROM tfv_home_last6(G.Date, G.Home) WHERE GameNumber <= 6 AND     
HomeGoals >= 3)

如果子查询中至少存在一行,而不是返回行,我想指定需要在子查询中返回的行数,类似于

SELECT * 
FROM Goals G
WHERE ROWCOUNT(*) >= 2 (SELECT NULL FROM tfv_home_last6(G.Date, G.Home) WHERE GameNumber <= 6 AND     
HomeGoals >= 3)

我不知道怎么办呢?

我正在使用SQL Server 2012.

最佳答案 你可以像你描述的那样完成子查询:

SELECT * 
FROM Goals G
WHERE (SELECT count(*)
       FROM tfv_home_last6(G.Date, G.Home)
       WHERE GameNumber <= 6 AND HomeGoals >= 3
      ) > 0;

但是,这需要计算整个计数.存在形式更有效,因为它在第一个匹配记录处停止.

在SQL Server 2012中,您还可以使用`cross apply:

SELECT * 
FROM Goals G cross apply
     (select count(*) as cnt
      FROM tfv_home_last6(G.Date, G.Home)
      WHERE GameNumber <= 6 AND HomeGoals >= 3
     ) a
WHERE a.cnt > 0;

我不知道哪个会有更好的性能,where子句中的相关子查询或者
交叉应用版本.

点赞