【发布时间】:2011-05-05 13:28:57
【问题描述】:
我正在处理一个存储过程,并且有一次我想检查我的表变量,看看是否有特定字段等于 null 的零行。换句话说,对于我表中的每一行,该字段都有一个非空值。我不想通过检查 count() 来做到这一点,而是通过使用 EXISTS。
目前我正在这样做:
IF EXISTS ( SELECT * FROM @sometable where somefield IS NULL )
SET @somefield = @somefield /* just a way to skip this */
ELSE
/* perform some logic */
现在我知道我可以使用 NOT EXISTS,但我假设 NOT EXISTS 比 EXISTS 慢得多。我发誓我最近读过一些东西(我认为是这样),其中有一个例子,说明如何用一个 Exists 子句做我想做的事情,但我找不到它并且忽略了为它添加书签。虽然也许我弄错了。
我设置 if/else 的原因是因为据我了解 EXISTS 将在 NOT EXISTS 之前返回,并且由于这是一个非常密集的存储过程(非常频繁地调用,有时是批量调用)我希望节省一些处理这里。
也许我认为这一切都错了,或者假设某些事情不正确。我是来学习的,所以如果我错了,请指出我正确的方向。
编辑:显然在这种情况下没有区别(不是 where 子句/子查询的一部分)。但是假设我在 where 子句中使用了存在,并且想要检查上面的确切情况(字段中的所有非空值),特别是当有问题的表可能有数千行时。 [对 SO 有点陌生,如果我应该将此作为自己的问题发布,请告诉我]
【问题讨论】:
-
主查询的 where 子句中的 all 非空值检查本质上是相同的上下文,因为每个查询只会执行一次。在子查询中检查所有非空值是一个非常糟糕的主意,因为每次执行子查询时都需要对相关表进行表扫描。
标签: sql sql-server-2000 exists not-exists