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

时间:2013-08-05 16:06:20

标签: sql sql-server-2012

是否可以使用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。

1 个答案:

答案 0 :(得分:2)

你可以像你描述的那样完成子查询:

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

但是,这需要计算整个计数。 exists表单更有效,因为它在第一个匹配记录处停止。

在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子句中的相关子查询或者 交叉申请版。