我有一个名为Staff的表和一个名为Supervisors的表。
员工有StaffID
,FirstName
,LastName
等。
主管包含RelationshipID
,StaffID
,SupervisorID
,SetBy
,SetOn
,Status
。
基本上,“主管”表为我们提供了员工自我关系的审计线索。我们有一个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.staffid
和SUPERVISOR.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/