我有一个表缺少信息,需要在非常具体的条件下插入。但是,我对如何继续感到困惑。
我有一张包含信息整体视图的表格。以项目为例
项目ID | 项目名称 |
---|---|
1 | 项目A |
2 | B项目 |
3 | C 项目 |
4 | D 项目 |
我有另一个表,其中包含第一个表的信息子集,其中显示了这些项目的状态和时间线。
项目状态ID | 项目ID | 项目状态 | 日期 |
---|---|---|---|
1 | 1 | 开始了 | 2020年10月2日 |
2 | 1 | 测试中 | 2021 年 5 月 6 日 |
3 | 1 | 完成了 | 2021 年 7 月 1 日 |
4 | 2 | 测试中 | 2019 年 1 月 30 日 |
5 | 2 | 完成了 | 2020年3月18日 |
6 | 4 | 开始了 | 2016年10月22日 |
7 | 4 | 完成了 | 2020年3月18日 |
从第二个表中可以看到,没有 Project B 'started' 的条目,并且根本没有 Project C 的条目。
我想为 Projects 添加缺少 'started' 状态且具有 任意日期:1/1/2000 的条目。所以新的第二个表将如下所示:
项目状态ID | 项目ID | 项目状态 | 日期 |
---|---|---|---|
1 | 1 | 开始了 | 2020年10月2日 |
2 | 1 | 测试中 | 2021 年 5 月 6 日 |
3 | 1 | 完成了 | 2021 年 7 月 1 日 |
4 | 2 | 测试中 | 2019 年 1 月 30 日 |
5 | 2 | 完成了 | 2020年3月18日 |
6 | 4 | 开始了 | 2016年10月22日 |
7 | 4 | 完成了 | 2020年3月18日 |
8 | 2 | 开始了 | 2000 年 1 月 1 日 |
9 | 3 | 开始了 | 2000 年 1 月 1 日 |
我想到的第一个方法是获取所有不具有所需状态的项目,但是我创建的脚本的结果是错误的。
SELECT t.ProjectID FROM t1 t
INNER JOIN t2 tt ON t.ProjectID = tt.ProjectID
WHERE pp.ProjectStatus != 'Started'
然后我尝试朝另一个方向走,发现所有do具有所需状态的项目,并且我成功地做到了这一点。
SELECT ProjectStatusID, ProjectID, ProjectStatus FROM t2
WHERE ProjectStatus NOT IN (SELECT ProjectStaus FROM t2
WHERE ProjectStatus != 'Started')
但是,我对如何在另一个脚本中使用此结果列感到困惑。显然,我可以使用 Where 子句创建一个长字符串,并复制粘贴所有 ProjectID 值,但这显然效率低下,特别是如果项目比我在上面的示例中给出的项目多得多的话。
我想你只是想要
NOT EXISTS
insert into ProjectStatus (ProjectId, ProjectStatus, [Date])
select ProjectId, 'Started', '1/1/2000'
from Project p
where not exists (
select 1
from ProjectStatus ps
where ps.ProjectId = p.ProjectId
and ps.ProjectStatus = 'Started'
);