[英]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.