存在/不存在:'select 1'vs'select field'

ano*_*xen 16 sql sql-server oracle exists

两者中哪一个表现更好(我最近被指责不小心我的代码,因为我在Oracle中使用了后者):

Select * 
from Tab1
Where (not) exists(Select 1 From Tab2 Where Tab1.id = Tab2.id)


Select * 
from Tab1
Where (not) exists(Select Field1 From Tab2 Where Tab1.id = Tab2.id)
Run Code Online (Sandbox Code Playgroud)

或者他们俩都一样?

请从SQL Server透视图和Oracle透视图中回答这两个问题.

我用google搜索(主要来自sql-server方面)并发现对此仍存在很多争论,尽管我现在的意见/假设是RDMBS中的优化者已经足够成熟,可以理解子查询所需要的只是布尔值.

Pat*_*man 16

是的,他们是一样的.exists检查子查询中是否至少有一行.如果是,则评估为true.子查询中的列无论如何都无关紧要.

根据MSDN,exists:

指定要测试行是否存在的子查询.

甲骨文:

EXISTS条件测试子查询中是否存在行.

也许MySQL文档更能解释:

传统上,EXISTS子查询以SELECT*开头,但它可以从SELECT 5或SELECT column1开始,或者任何东西.MySQL忽略了这样一个子查询中的SELECT列表,所以没有区别.

  • Postgres 有什么不同吗? (2认同)
  • PostgreSQL是一样的.您也可以选择null作为其他任何东西. (2认同)

The*_*war 5

我知道这很旧,但是想补充一下我最近观察到的几点。

即使存在只检查是否存在,当我们全部编写“ select *”时,列也会被扩展,除了这微小的开销外,没有任何区别。

来源:http
//www.sqlskills.com/blogs/conor/exists-subqueries-select-1-vs-select/

更新:
我提到的文章似乎无效。即使在我们撰写本文时select 1,SQLServer也会展开所有列..

使用各种方法时,请参考以下链接以进行深度分析和性能统计。

使用Exists 1或Exists存在的子查询*

  • 科纳的文章实际上是错误的。他建议“ SELECT *”将扩展所有列元数据,而“ SELECT 1”则不会。但是他们实际上都这样做。您可以通过拒绝对列的权限并运行`SELECT 1 WHERE EXISTS(SELECT 1 FROM T);`来看到此错误,这可能会因`SELECT对列'Foo'的权限被拒绝或仅通过计时SELECT的作用而意外失败。同时添加更多列或查看调试器http://stackoverflow.com/a/6140367/73226 (2认同)