【问题标题】:NOT IN vs NOT EXISTS and select 1 1?NOT IN vs NOT EXISTS 并选择 1 1?
【发布时间】:2014-07-18 09:46:33
【问题描述】:

我是一个初学者,我完全了解NOT IN 所做的事情,但并没有真正了解EXISTSNOT EXISTS。 更何况,我不明白这是做什么的:

SELECT TOP 1 1 
FROM tblSomeTable

这个查询实际上做了什么?

作为参考,我一直在使用这样的东西:

SELECT COUNT(E_ID)
FROM  tblEmployee e    
INNER JOIN  tblManager m 
      ON e.tbl_ID = m.tbl_ID         
WHERE NOT EXISTS(SELECT TOP 1 1 
                   FROM tblEmployee e2 
                   WHERE e2.E_ID = e.E_ID 
                       AND isFired = 'N'
                   )

我想我还没有阅读/看过外行的解释,这对我来说是有意义的。即使看了Diff between Top 1 1 and Select 1 in SQL Select Query我还是不明白

【问题讨论】:

  • 一个建议,当使用EXISTSNOT EXISTS时,没有必要在那里使用SELECT TOP 1。一个简单的SELECT * 将使用聚集索引并且足够快。还有一件事,你也可以检查EXISTS (SELECT 1/0 FROM A),你会看到1/0实际上没有被执行。所以,在EXISTS 中使用TOP 真的没有必要。
  • @zhongxiao37:我想你写的就是这个问题的实际问题。考虑将您的解释转换为答案(不过,您可能还想扩展“EXISTS 中不必要的顶部”位)。

标签: sql sql-server exists not-exists


【解决方案1】:

我认为实际上需要回答的问题是EXISTS (SELECT TOP 1 1 FROM MyTable) 是否真的有必要。

Top 1 1 告诉查询为任何答案选择常量“1”。

Top 1 部分告诉它一旦找到匹配项就停止并返回“1”。

EXISTS (SELECT TOP 1 FROM MyTable) 还不够吗?

【讨论】:

    【解决方案2】:

    您的第一个查询将只获得结果集中总行数中最靠前的记录(第一条记录)。因此,如果您的查询返回 10 行 .. 您将获得第一行。阅读更多关于TOP

    SELECT TOP 1 FROM tblSomeTable
    

    在您的第二个查询中,() 下的部分是一个子查询,在您的情况下,它是一个相关子查询,将为外部查询处理的每一行评估一次。

    NOT EXISTS 实际上会检查子查询中是否存在行

    WHERE NOT EXISTS
    (
    SELECT TOP 1 1 FROM tblEmployee e2 WHERE e2.E_ID = e.E_ID AND isFired = 'N'
    )
    

    阅读有关Correlated subquerySubqueries with EXISTS 的更多信息

    【讨论】:

      【解决方案3】:

      SELECT TOP 1 1 FROM <table> 将始终返回值为 1 的第一行,您已将其定义为常量。

      因此,如果您将其更改为SELECT TOP 1 2 FROM <table>,它将始终返回值为 2。

      SQL 中INEXISTS 运算符之间的区别

      请阅读:

      http://awesomesql.wordpress.com/2009/07/31/difference-between-in-and-exists-operators-in-sql/

      【讨论】:

      • 我觉得链接资源不是很好。它显示了如何使用它,而不是它有什么区别。它还指出 EXISTS 表现更好,这不是真的,这真的取决于。
      • 如果你有明确的一组(小组)值,那么 IN 子句可能比 EXISTS 更有优势。在所有其他情况下 EXISTS 它比 IN 子句产生更好的结果,因为它必须只评估为布尔值,或者换句话说,找到第一次出现的出现
      猜你喜欢
      • 2016-02-11
      • 2014-12-29
      • 1970-01-01
      • 2011-01-15
      • 2021-10-02
      • 2015-07-06
      • 2021-10-02
      • 2015-10-13
      • 2018-01-08
      相关资源
      最近更新 更多