sql - 在 Sql Server 中使用 "IF NOT EXISTS(SELECT..."时,选择哪些列有关系吗?

标签 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)

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

最佳答案

我认为早在 SQL Server 6.5 - 7 时期,他们就让查询优化器足够聪明,知道:

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

实际上不需要返回任何行数据。使用 SELECT 1 的建议早于这一建议,但至今仍然是一个神话。

可以说,这是 SQL 标准的一个错误 - 他们应该允许 EXISTSFROM 子句开头,并且没有 SELECT完全没有一部分。

<小时/>

来自 Subqueries with EXISTS :

The select list of a subquery introduced by EXISTS almost always consists of an asterisk (*). There is no reason to list column names because you are just testing whether rows that meet the conditions specified in the subquery exist.

关于sql - 在 Sql Server 中使用 "IF NOT EXISTS(SELECT..."时,选择哪些列有关系吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19543616/

相关文章:

mysql - 使用多个条件加入查询

sql - 如何在SQL Server中更好地复制一组数据

sql-server - 多列的唯一约束

MySQL:查找在网站上注册然后当天购买的用户

sql - 当我添加 LIMIT 1 时,使用 ORDER BY 的查询速度是原来的 13 倍

MySQL - 连接问题

SQL:使用案例何时更改列值

c# - EntityFramework 包版本 ="6.1.3"和 Web 配置版本 6.0.0.0?

sql - OPENROWSET 将数据从一台服务器复制到另一台服务器的性能

SQL 子查询 - 您执行 SELECT 语句的顺序是什么?