簡體   English   中英

SQL左聯接,但不希望左表中的所有記錄

[英]SQL Left Join but don't want all records in the left table

我有2個表格-項目和狀態更新。 項目表具有ID,優先級和狀態(除其他外)字段,我的狀態更新表具有ProjectID和日期等字段。

我正在嘗試建立一個查詢,以提取所有尚未完成或未取消的高優先級項目,並告訴我在過去14天內哪些項目沒有相關的狀態更新。

我有以下內容,但是它給了我左表中的所有項目,並且沒有篩選狀態未完成或取消的高優先級項目。

任何幫助將不勝感激。

Select proj.id, proj.Priority, proj.status, proj.ProjectName,  status_tmp.statusdate,     status_tmp.statusdetail

FROM proj 

LEFT JOIN (SELECT s1.*
FROM projectstatus AS s1
LEFT JOIN projectstatus AS s2
ON s1.statusproj = s2.statusproj AND s1.statusdate < s2.statusdate

WHERE s2.statusproj IS NULL ) as status_tmp

ON (proj.id=status_tmp.statusproj)

where proj.Priority='High' AND proj.status!='Cancelled' and 
proj.status!='Completed' AND 
status_tmp.statusdate < DATE_SUB(CURDATE(),INTERVAL 14 DAY) OR 
status_tmp.statusdate IS null 

嘗試這樣在您的where子句的最后部分加上括號:

Select proj.id, proj.Priority, proj.status, proj.ProjectName,  status_tmp.statusdate,     status_tmp.statusdetail

FROM proj 

LEFT JOIN (SELECT s1.*
FROM projectstatus AS s1
LEFT JOIN projectstatus AS s2
ON s1.statusproj = s2.statusproj AND s1.statusdate < s2.statusdate

WHERE s2.statusproj IS NULL ) as status_tmp

ON (proj.id=status_tmp.statusproj)

where proj.Priority='High' AND proj.status!='Cancelled' and 
proj.status!='Completed' AND 

(status_tmp.statusdate < DATE_SUB(CURDATE(),INTERVAL 14 DAY) OR 
status_tmp.statusdate IS null )

如果狀態表僅將ProjectID作為鍵:

SELECT P.*
FROM
    proj P
        LEFT JOIN projectstatus S ON P.id = S.ProjectID
WHERE
    P.Priority = 'High'
    AND P.status NOT IN ('Cancelled', 'Completed')
    AND
        (
        S.statusdate < DATE_SUB(CURDATE(), INTERVAL 14 DAY)
        OR
        S.statusdate IS NULL
        )

否則,您還需要在狀態表上進行過濾以選擇當前的最新狀態(可能不正確)。

暫無
暫無

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

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