2014-12-09 1 views
0

나는 이것을 알아 내려고 노력하고 있습니다. 나는 외부 조인 (또는 WHERE NOT IN 문)과 함께 창 함수를 사용하여이 작업을 수행하는 간단한 방법이 있음을 알고 있지만 계속 원으로 간다. 내 데이터를 세트로 분해해야하는 부분에 붙들려있다. 처음에는이 데이터베이스를 설계하지 않았으므로 정규화되지 않았습니다.외부와 윈도우 함수 T-SQL

약 50 개의 항목 목록을 나타내는 "TemplateItems"테이블이 있습니다. 이 항목 이어야하며 모든 프로젝트에 속해야합니다. 내가 프로젝트 테이블, ProjectID에 의해 에서 누락 된 모든 TemplateItems을 찾아 결과를 출력 할 필요가

ProjectID | TemplateItem | PercentComplete 
------------------------------------------- 
Project1   a    100 
Project1   b    100 
Project1   c    100 
Project1   d    100 
Project1   e    100 
Project2   a    100 
Project2   c    100 
Project2   e    100 

:

TemplateItem 
------------- 
    a 
    b 
    c 
    d 
    e  
    f 
    g 

내 "프로젝트"표는이 같은 프로젝트의 목록이 포함되어 있습니다. 결과이 될 것이다 그래서 :

ProjectID | MissingTemplateItem 
------------------------------- 
Project1   f    
Project1   g   
Project2   b   
Project2   d   
Project2   f   
Project2   g   

나는 여기에 올바른 방향으로 어떤 힌트를 부탁드립니다. ProjectID로 그룹화하고 여기에 나를 던지고있는 TemplateItems 테이블과 비교합니다. 반복적 인 반복 작업을 계속하고 싶지만, 실제로 그렇게하는 것이 옳은 방법이 아니라는 것을 느낄 수 있습니다.이 작업에서 벗어나지 않아야합니다.

답변

1

다음은 접근 방법입니다. cross join을 사용하여 가능한 모든 조합을 생성하십시오. 그런 다음 존재하는 것을 필터링하십시오. 한 가지 방법이 있습니다.

select p.ProjectId, t.TemplateItem as MissingTemplateItem 
from (select distinct ProjectId from TemplateItems) p cross join 
    (select distinct TemplateItem from TemplateItems) t left join 
    TemplateItems ti 
    on ti.ProjectId = p.ProjectId and ti.Template_item = t.TemplateItems 
where ti.ProjectId is null; 
+0

이 문제는 가까운 것으로 생각됩니다. – user3191188

+0

이 방법이 효과가 있습니까? –

+0

TemplateIDem 테이블에 ProjectID가 없으므로 구문을 변경해야했습니다. 그것은 효과가있는 것처럼 보이지만, Projects 테이블에 존재하는 무작위로 보이는 아이템을 선택합니다. 나는 아직도 그것을 알아 내려고 노력하고 있으며, 대답 할 시간을내어 주셔서 감사합니다. – user3191188