我以前是这样写我的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 *
EXISTS
SELECT 1
SELECT *
IF EXISTS (SELECT 1 FROM TABLE WHERE Columns=@Filters) BEGIN UPDATE TABLE SET ColumnsX=ValuesX WHERE Columns=@Filters END
这真的有区别吗?
不,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>。
<select list>
<subquery>
<exists predicate>
<value expression>
<literal>