首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL慢嵌套查询

SQL慢嵌套查询
EN

Stack Overflow用户
提问于 2011-07-26 10:53:27
回答 2查看 518关注 0票数 0

我有一张叫做Staff的桌子和一张叫做Supervisors的桌子。

员工有StaffIDFirstNameLastName等。

Supervisor包含RelationshipIDStaffIDSupervisorIDSetBySetOnStatus

基本上,Supervisors表为我们提供了员工自我关系的审计跟踪。我们有一个员工表,还有一个员工表:员工关系(supervisor: Staff )和一些额外信息(过时、当前、不正确),以及设置它的StaffID和设置时间。

现在,我正在编写一个查询来查找所有孤立的员工。我有:

代码语言:javascript
复制
SELECT *
  FROM Staff
 WHERE StaffID NOT IN (SELECT StaffID
                         FROM Supervisors
                        WHERE Status = 0 
                           OR Status = 2);

(状态0是来自公司数据库的初始加载,2是已验证的修改记录。其他都是“过时的”、“不正确的”等等。)

问题是我有6000多名员工和5000多名员工:主管关系,这基本上是一个NxM查询,这意味着MySQL必须筛选300万个排列。

我不是SQL忍者,有没有更好的方法呢?

(请注意,我根本不希望经常运行这个特定的查询)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-07-26 11:14:57

假设SUPERVISOR.staffidSUPERVISOR.status列是不可为空的,请使用:

代码语言:javascript
复制
   SELECT st.*
     FROM STAFF st
LEFT JOIN SUPERVISOR s ON s.staffid = st.staffid
                      AND s.status NOT IN (0,2)
    WHERE s.staffid IS NULL

否则,NOT IN/NOT EXISTS是等价的&如果列可以为空,则执行得更好。

有关详细信息,请访问:

  • http://explainextended.com/2009/09/18/not-in-vs-not-exists-vs-left-join-is-null-mysql/
  • http://explainextended.com/2010/05/27/left-join-is-null-vs-not-in-vs-not-exists-nullable-columns/
票数 3
EN

Stack Overflow用户

发布于 2011-07-26 10:58:46

这将更好地作为连接而不是NOT IN来执行:

代码语言:javascript
复制
SELECT st.* 
FROM Staff st
LEFT JOIN Supervisors su ON st.StaffID = su.StaffID 
          AND (su.Status <> 0 AND su.Status <> 2)
WHERE su.StaffId IS NULL

下面是我如何对其进行转换:

代码语言:javascript
复制
NOT IN (SELECT StaffID FROM Supervisors WHERE Status = 0 OR Status = 2)

通过应用布尔定律,相当于

代码语言:javascript
复制
IN (SELECT StaffID FROM Supervisors WHERE Status <> 0 AND Status <> 2);

(假设Status永远不能为NULL),并且从那里只有一个连接。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6824725

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档