相当多的数据库脚本具有以下形式:
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引入的子查询的选择列表几乎总是由星号(*)组成.没有理由列出列名,因为您只是测试是否存在满足子查询中指定的条件的行.
| 归档时间: |
|
| 查看次数: |
1638 次 |
| 最近记录: |