2012-03-17 96 views
0

我有2個表。一個包含項目列表,另一個包含這些項目中的任務列表。檢索所有記錄,其中所有相關記錄等於字符串

我想拉一個只列出所有任務狀態爲「完成」的項目列表。

我的數據是這樣的:

項目表:

ID,ProjectName,ProjectStatus 

任務表:

ID, ProjectID, TaskName, TaskStatus 

Tasks.ProjectID = Projects.ID

我可以做的基本的SELECT語句來獲得所有記錄,並且可以過濾TaskStatus處於特定狀態的位置,但又是一次,我只想要一個完成所有任務的項目列表。

在此先感謝您的幫助!

+1

現在只是爲了確保:當你說所有的相關任務後,您使用的傳統方式術語,意思是其所有的零個或多個任務已完成,或通過一些機會你會要求項目至少有一項任務?通常情況下,一個沒有相關任務的項目將是你想要的東西,但有些人卻以有趣的非經典邏輯方式使用「全部」...... – 2012-03-17 23:43:52

+0

感謝您提出澄清。我的意思是全部。我創建了應用程序,以便在創建項目時創建一個初始任務。 – 2012-03-18 13:21:58

回答

1

您可以使用NOT EXISTS子查詢:

select * 
    from Projects P 
where NOT EXISTS (select 1 from Tasks where Tasks.ProjectID = P.ID and TaskStatus <> 'COMPLETE') 

編輯完成

您還可以使用NOT IN子查詢:

select * 
    from Projects 
where ID NOT IN (select ProjectID from Tasks where TaskStatus = 'COMPLETE') 

是否使用一個或另外,它將取決於你的表數據量和索引:

第一個選項將爲父查詢的每一行運行子查詢,但將通過ProjectID索引訪問(如果存在,可能是)。

第二個選項將首先運行子查詢,僅運行一次,然後使用子查詢結果運行父查詢。但是子查詢可能不會使用任何索引,因爲它不可能在TaskStatus字段上有一個索引(這沒有多大意義)。

但是,如果Tasks表中沒有多行,那麼在任何情況下都不會使用索引,因爲只對表執行全面掃描會更便宜。因此,我的建議是,檢查執行計劃,比較成本,如果可能的話運行幾個基準來決定這個選項或其他任何情況。

+0

謝謝。這正是我需要的。 – 2012-03-18 19:27:16

+0

酷!選擇答案然後! :) – 2012-03-18 19:29:58

0

試試這個:

SELECT ID, ProjectName   -- This query will select all projects where 
FROM Projects      -- ID is not on the list of the subquery 
WHERE ID NOT IN          
     (SELECT ProjectID     -- This subquery will get all 
      FROM Tasks       -- ProjectID who has INCOMPLETE 
      WHERE TaskStatus <> 'COMPLETE')  -- taskStatus 
相關問題