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

Pau*_*rds 6 sql sql-server

相当多的数据库脚本具有以下形式:

IF NOT EXISTS(SELECT * FROM Countries WHERE Name = 'France')
INSERT INTO(Countries)
Run Code Online (Sandbox Code Playgroud)

但是,我也看到人们这样做:

IF NOT EXISTS(SELECT CountryID FROM Countries WHERE Name = 'France')
INSERT INTO(Countries)
Run Code Online (Sandbox Code Playgroud)

乃至:

IF NOT EXISTS(SELECT 1 FROM Countries WHERE Name = 'France')
INSERT INTO(Countries)
Run Code Online (Sandbox Code Playgroud)

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

Dam*_*ver 10

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

IF NOT EXISTS(SELECT * FROM Countries WHERE Name = 'France')
Run Code Online (Sandbox Code Playgroud)

实际上不需要返回任何行数据.使用SELECT 1前置的建议,然而继续作为一个神话.

可以说,这是SQL标准的错误 - 它们应该允许EXISTS从该FROM条款开始而根本没有SELECT一部分.


带有EXISTS的子查询:

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