繁体   English   中英

SQL INSERT INTO TABLE 与动态和 static 列值

[英]SQL INSERT INTO TABLE with dynamic and static column values

名为“代码类型”的目标表:

合同编号 白蚁 代码1 代码2 代码3 创建ID 创建日期 更新id 最后更新
合同ID1 终端1 静止的# 静止的# 一个 静态名称 获取日期() 静态名称 获取日期()
合同ID1 终端1 静止的# 静止的# 静态名称 获取日期() 静态名称 获取日期()
合同ID2 termid2 静止的# 静止的# 一个 静态名称 获取日期() 静态名称 获取日期()
合同ID2 termid2 静止的# 静止的# 静态名称 获取日期() 静态名称 获取日期()

你好呀。 使用 SSMS 17。

好的,所以我正在努力有效地实现的是一个查询,它将将行插入到上面的表格式中,但基于连接的数据,以根据其他两个表的条件动态更改 contractid 和 termid; 以及从 code3 的 20 个选项的已知列表中插入值。

ContractID 将通过基于 contract_name 的 where 条件从“合同”表中找到。 contract_name 仅存在于此“合同”表中。

TermID 将通过基于 term_name 的 where 条件找到,并且必须链接到上面的 contractID。 TermID 和 term_name 仅存在于“term”表中,在 contractID 上链接到“contract”

对于这两个值,简单的 select 将是:

select c.contractid, t.termid
from contract c
left join term t on t.contractid = c.contractid and t.term_name like 'term name%'
where c.contract_name like 'contract name%'

code1 和 code2 是已知值。 code3 有 20 个值,每个值都需要插入到这个“代码类型”表中,它们都是数字和字母字符(不是所有AZ、1-0,而是一个只有 20 个的较小列表)。 重申,在 contractid1 中的 termid1 需要为所有离散的 20 个 code3 值(A、B、C...Z、1、2...0)输入行,其中 static 字段是已知的,但 contractid 和 termid 是动态的根据上述条件插入。 值的 rest 也是已知的 static 值或 getdate()。

20 个不同的代码存在于第 4 个表中,我们将其称为“code3values”,因此我想可以在解决方案中从该表中提取它们以循环通过 code3 输入。

我通常会做的是将上述 select 导出到 Excel 中,然后为每种可能性手动创建一个“插入”行,例如非常无聊:

insert into codetypes values('contractid1','termid1','1','2','A','myname',getdate(),'myname',getdate())
insert into codetypes values('contractid1','termid1','1','2','B','myname',getdate(),'myname',getdate())

这次数据太大了,我想学习一种更高效/更有创意的方法。

我认为下面是一个不错的开始,但我仍然需要一种方法来循环浏览 20 个 code3 值选项。

insert into codetypes
(contractid, termid, code1, code2, code3, createid, createdate, updateid, lastupdate)

select c.contractid, t.termid, '1','2','A','name',getdate(),'name',getdate()
from term t
left join contract c on c.contractid = t.contractid
where t.term_name like 'term name%'
and c.contract_name like 'contract name%'

在发布之前我没有花足够的时间,但这是我想出的答案:

insert into codetypes
    (contractid, termid, code1, code2, code3, createid, createdate, updateid, lastupdate)
select
    c.contractid, t.termid, '1', '2', f.code3, 'name', getdate(), 'name', getdate()
from contract c
    left join term t on t.contractid = c.contractid
    join code3values f on f.code3 != ''
where c.contract_name like 'contract name%'
    and t.term_name like 'term name%'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM