[英]SQL Slow nested query
我有一個名為Staff的表和一個名為Supervisors的表。
Staff具有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忍者,有更好的方法嗎?
(請注意,我根本不希望經常運行此特定查詢)
這最好是作為聯接而不是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),並且只有一個聯接。
假設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
是等效的,並且如果列可為空,則性能會更好。
有關更多信息:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.