我正在试图解决这个问题。我知道有一种简单的方法可以做到这一点,可能使用具有外连接的窗口函数(或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表进行比较。我一直想做一个迭代循环,但我真的觉得这不是正确的方法,我不应该克服这个问题。
答案 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;