4

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

4

1 回答 1

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子句中的相关子查询或交叉应用版本。

于 2013-08-05T16:13:10.867 回答