SQL慢嵌套查询

时间:2011-07-26 02:53:27

标签: mysql sql subquery

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

工作人员有StaffIDFirstNameLastName等...

主管包含RelationshipIDStaffIDSupervisorIDSetBySetOnStatus

基本上,主管表格为我们提供了员工自我关系的审计线索。我们有一个员工表,我们有一个员工表:员工关系(主管:员工),其中包含一些额外信息(过时,当前,不正确)以及设置它和设置时间的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忍者,有更好的方法吗?

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

2 个答案:

答案 0 :(得分:3)

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

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

以下是我改变它的方式:

NOT IN (SELECT StaffID FROM Supervisors WHERE Status = 0 OR Status = 2)
通过应用布尔定律相当于

IN (SELECT StaffID FROM Supervisors WHERE Status <> 0 AND Status <> 2);

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

答案 1 :(得分:3)

假设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等同于&amp;如果列可以为空,则执行得更好。

欲了解更多信息: