在Sql Server中使用“IF NOT EXISTS(SELECT ...”)时,选择哪些列是否重要?

时间:2013-10-23 13:52:28

标签: sql sql-server

很多数据库脚本的格式如下:

IF NOT EXISTS(SELECT * FROM Countries WHERE Name = 'France')
INSERT INTO(Countries)

但是,我也见过人们这样做:

IF NOT EXISTS(SELECT CountryID FROM Countries WHERE Name = 'France')
INSERT INTO(Countries)

甚至:

IF NOT EXISTS(SELECT 1 FROM Countries WHERE Name = 'France')
INSERT INTO(Countries)

最后一个的优点可能是它更有效:查询实际上并没有使用子查询中的任何列,因此可能更快不能将它们中的任何一个带回来。但它看起来很奇怪,所以它让我觉得它可能让一些人感到困惑。它对实际执行时间有什么影响吗?

3 个答案:

答案 0 :(得分:10)

我认为它回到了SQL Server的6.5到7期间,他们让查询优化器足够聪明,知道:

IF NOT EXISTS(SELECT * FROM Countries WHERE Name = 'France')

实际上不需要返回任何行数据。建议使用SELECT 1作为神话的前提,但仍在继续作为一个神话。

可以说,这是SQL标准的错误 - 他们应该允许EXISTSFROM子句开始,而根本没有SELECT部分。


来自Subqueries with EXISTS

  

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

答案 1 :(得分:3)

没有, sql server足够智能,可以为您进行优化。

答案 2 :(得分:3)

没有。唯一重要的是返回行是否返回,这就是SELECT 1足够好的原因。