相当多的数据库脚本具有以下形式:
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 标准的一个错误 - 他们应该允许 EXISTS
以 FROM
子句开头,并且没有 SELECT
完全没有一部分。
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/