在表中创建没有特定列值的数据行

问题描述 投票:0回答:1

我有一个表缺少信息,需要在非常具体的条件下插入。但是,我对如何继续感到困惑。

我有一张包含信息整体视图的表格。以项目为例

项目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 值,但这显然效率低下,特别是如果项目比我在上面的示例中给出的项目多得多的话。

sql sql-server sql-update
1个回答
1
投票

我想你只是想要

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'
);
© www.soinside.com 2019 - 2024. All rights reserved.