【发布时间】:2013-08-05 16:06:19
【问题描述】:
是否可以使用 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。
【问题讨论】:
-
这是可能 - 但不是推荐 - 为什么?想象一个有 1000 万行的表;如果您使用
COUNT(*) > 0,则查询必须运行在整个1000 万行 以计算您的值的出现次数并返回该计数。另一方面,如果您使用IF EXISTS(),则只要第一次出现,查询就会停止。所以是的 - 你可以但你不应该 -
@marc_s - 这是一个很好的警告,但它可能仍然是最佳选择。
-
@Greg:绝对不是在一张大桌子上! (> 100 万行)
-
@marc_s - OP 没有提到一张大桌子,这就是为什么我说这是一个警告。
-
@YK:如果您有一个支持子查询的
WHERE和ORDER BY子句的良好索引,并且您没有选择TOP (9999999) ....- 那么是的,这可能会起作用。使用索引和足够小的数字,您将只获得该数量的行
标签: sql sql-server-2012