小编典典

使用Exists 1或Exists存在的子查询*

sql

我以前是这样写我的EXISTS检查的:

IF EXISTS (SELECT * FROM TABLE WHERE Columns=@Filters)
BEGIN
   UPDATE TABLE SET ColumnsX=ValuesX WHERE Where Columns=@Filters
END

前一世代的DBA告诉我,当我做一个EXISTS子句时,请使用SELECT 1而不是SELECT *

IF EXISTS (SELECT 1 FROM TABLE WHERE Columns=@Filters)
BEGIN
   UPDATE TABLE SET ColumnsX=ValuesX WHERE Columns=@Filters
END

这真的有区别吗?


阅读 319

收藏
2021-05-05

共1个答案

小编典典

不,SQL Server很聪明,并且知道它已用于EXISTS,并且不向系统返回任何数据。

Quoth Microsoft:http ://technet.microsoft.com/en-
us/library/ms189259.aspx?ppud =4

由EXISTS引入的子查询的选择列表几乎总是由星号(*)组成。没有理由列出列名,因为您只是在测试是否存在满足子查询中指定条件的行。

要检查自己,请尝试运行以下命令:

SELECT whatever
  FROM yourtable
 WHERE EXISTS( SELECT 1/0
                 FROM someothertable 
                WHERE a_valid_clause )

如果它实际上在用SELECT列表做某事,它将以零错误抛出div。没有。

编辑:请注意,SQL标准实际上是在谈论这一点。

ANSI SQL
1992标准,第191页,http://www.contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt

3)情况:
a)如果<select list>“ *”简单地包含在<subquery> 紧接在中的a中<exists predicate>,则<select list> a等于a<value expression> 是任意的<literal>

2021-05-05