我有一个名为Staff的表和一个名为Supervisors的表。

员工有StaffIDFirstNameLastName等。

主管包含RelationshipIDStaffIDSupervisorIDSetBySetOnStatus

基本上,“主管”表为我们提供了员工自我关系的审计线索。我们有一个Staff表,还有一个Staff:Staff关系表(supervisor:staff),上面有一些额外的信息(过时,当前,不正确),还有一个StaffID来设置它以及何时设置。

现在,我正在编写查询以查找所有孤立的工作人员。我有:

SELECT *
  FROM Staff
 WHERE StaffID NOT IN (SELECT StaffID
                         FROM Supervisors
                        WHERE Status = 0
                           OR Status = 2);


(状态0是从公司DB加载的初始状态,状态2是已验证的修改记录。其他所有状态均已“过时”,“不正确”等。)

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

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

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

最佳答案

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

   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/

关于mysql - SQL慢速嵌套查询,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6824725/

10-15 21:21