2012-03-17 6 views
0

2 개의 테이블이 있습니다. 하나는 프로젝트 목록을 포함하고 다른 하나는 해당 프로젝트의 작업 목록을 포함합니다.관련된 모든 레코드가 문자열과 동일한 모든 레코드 검색

모든 작업의 ​​상태가 "완료"인 프로젝트 목록 만 가져 오려고합니다.

프로젝트 테이블 : :

내 데이터는 다음과 같습니다

ID,ProjectName,ProjectStatus 

작업 테이블 : 나는 모든 기록을 얻을 수있는 기본적인 SELECT 문을 수행 할 수

ID, ProjectID, TaskName, TaskStatus 

Tasks.ProjectID = Projects.ID

TaskStatus가 특정 상태이지만 다시 필터링 할 수 있습니다. , 나는 모든 작업이 완료된 프로젝트 목록 만 원합니다.

미리 도움을 청하십시오!

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

하나 또는 사용 여부 :

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

편집

당신은 또한 NOT 하위 쿼리에서 사용할 수있는 완료 :

+1

을 지금 바로 확인 : 모든 관련 작업 당신은 그것의 0 개 이상의 작업을 모두 의미하는 기존의 방식으로 용어를 사용하고, 완료 말할 때 완료, 또는 어떤 경우에는 프로젝트에 최소한 하나의 작업이 필요합니까? 일반적으로 연관된 작업이없는 프로젝트는 원하는 것이지만 일부 사람들은 재미 있고 비 고전적인 논리 방식으로 "모두"를 사용합니다. –

+0

설명해 주셔서 감사합니다. 나는 모든 것을 의미했다. 프로젝트를 만들 때 초기 작업을 만들 수 있도록 응용 프로그램을 만들었습니다. –

답변

1

당신이 NOT을 사용할 수는 하위 쿼리가 존재 기타, 테이블 데이터 볼륨 및 색인에 따라 다릅니다.

첫 번째 옵션은 상위 쿼리의 각 행에 대해 하위 쿼리를 실행하지만 ProjectID 인덱스로 액세스합니다 (존재하는 경우 예일 수도 있음).

두 번째 옵션은 먼저 하위 쿼리를 한 번만 실행 한 다음 하위 쿼리 결과를 사용하여 상위 쿼리를 실행합니다. 그러나 TaskStatus 필드에 인덱스를 가질 가능성이 없으므로 하위 쿼리는 아마 어떤 인덱스도 사용하지 않을 것입니다 (많은 의미가 없습니다).

하지만 작업 표에 행이 많지 않으면 어떤 경우에도 색인을 사용하지 않아도됩니다. 표를 전체적으로 스캔하는 것이 더 저렴하기 때문입니다. 따라서 필자의 권고는 실행 계획을 확인하고 비용을 비교하며, 가능하다면이 옵션이나 다른 경우에 더 적합한 옵션을 결정할 수있는 벤치 마크를 실행하십시오.

+0

고맙습니다. 이것은 내가 필요한 것입니다. –

+0

멋지다! 대답을 선택하십시오! :) –

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