外部联接与窗口函数T-SQL

时间:2014-12-09 13:58:38

标签: sql sql-server

我正在试图解决这个问题。我知道有一种简单的方法可以做到这一点,可能使用具有外连接的窗口函数(或WHERE NOT IN语句),但我一直在圈子里。我在我需要将数据分成几组的部分被耽搁了。我最初没有设计这个数据库,因此没有规范化。

我有一个" TemplateItems"表格,代表约50项的清单。这些项应该成为每个项目的一部分。

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

我的"项目" table包含一个项目列表,如下所示:

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

我需要输出结果,找到Projects表中所有缺少的TemplateItems, by ProjectID 。 结果就是这样:

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

我很欣赏这里正确方向的任何提示。它通过ProjectID对其进行分组,并对将我扔到这里的TemplateItems表进行比较。我一直想做一个迭代循环,但我真的觉得这不是正确的方法,我不应该克服这个问题。

1 个答案:

答案 0 :(得分: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;