簡體   English   中英

SQL慢速嵌套查詢

[英]SQL Slow nested query

我有一個名為Staff的表和一個名為Supervisors的表。

Staff具有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忍者,有更好的方法嗎?

(請注意,我根本不希望經常運行此特定查詢)

這最好是作為聯接而不是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.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是等效的,並且如果列可為空,則性能會更好。

有關更多信息:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM