我有3张桌子"#tblData","#tblMaster"和#34;#tblChild",我需要拆分" #tblData"进入另外2个表#34;#tblMaster"和#34;#tblChild"。
"#tblChild"表,我需要来自"#tblMaster"以及来自"#tblData"的其他数据;表
DO $$
BEGIN
IF (NOT EXISTS (SELECT *
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'st'
AND TABLE_NAME = 'config_change_log'))
THEN
CREATE SCHEMA st;
CREATE TABLE st.config_change_log
(
id serial NOT NULL PRIMARY KEY,
last_config_version varchar(255),
is_done Boolean,
chage_description varchar(255)
);
END IF;
END
$$
我正在尝试使用MERG,但无法从"#tblMaster"中插入身份值。到#tblChild"。
光标下方解决了我的问题,但寻找更好的替代品,
Create Table #tblData (Id int, UniqueKey VARCHAR(10), DateTimeNow DATETIME, UpdateBy VARCHAR(10))
insert into #tblData values (1, 'uq1', getdate(), 'abc'), (2, 'uq2', getdate()+1, 'xyz')
--select * from #tblData
create Table #tblMaster (MasterId INT IDENTITY(100,1), DateTimeNow DATETIME, UpdateBy VARCHAR(10))
create Table #tblChild (ChildId INT IDENTITY(10,1), MasterId INT, UniqueKey VARCHAR(10), DateTimeNow DATETIME)
答案 0 :(得分:0)
您需要在#tblMaster
中添加一列,以便从Id
#tblData
Create Table #tblData (Id int, UniqueKey VARCHAR(10), DateTimeNow DATETIME, UpdateBy VARCHAR(10))
create Table #tblMaster (MasterId INT IDENTITY(100,1), OldId int, DateTimeNow DATETIME, UpdateBy VARCHAR(10))
create Table #tblChild (ChildId INT IDENTITY(10,1), MasterId INT, UniqueKey VARCHAR(10), DateTimeNow DATETIME)
insert into #tblData
select *
from (
values
(1, 'uq1', getdate(), 'abc'),
(2, 'uq2', getdate()+1, 'xyz')
) d (Id , UniqueKey , DateTimeNow, UpdateBy )
insert into #tblMaster
select Id, DateTimeNow, UpdateBy
from #tblData
insert into #tblChild
select MasterId, UniqueKey, d.DateTimeNow
from #tblData d
inner join #tblMaster m on m.OldId = d.Id
select * from #tblChild
select * from #tblMaster
drop table #tblChild
drop table #tblMaster
drop table #tblData
答案 1 :(得分:0)
在这种简单的情况下,不需要光标。
您可以将MERGE
与OUTPUT
子句一起使用。 OUTPUT
中的MERGE
子句允许从源表和目标表中访问列。
示例数据
Create Table #tblData (Id int, UniqueKey VARCHAR(10), DateTimeNow DATETIME, UpdateBy VARCHAR(10));
insert into #tblData values (1, 'uq1', getdate(), 'abc'), (2, 'uq2', getdate()+1, 'xyz');
create Table #tblMaster (MasterId INT IDENTITY(100,1), DateTimeNow DATETIME, UpdateBy VARCHAR(10));
create Table #tblChild (ChildId INT IDENTITY(10,1), MasterId INT, UniqueKey VARCHAR(10), DateTimeNow DATETIME);
<强>查询强>
MERGE
可以插入,更新和删除,但我们只需要简单插入,因此连接条件始终为false(1=0
)。
MERGE INTO #tblMaster AS Dest
USING
(
SELECT UniqueKey, DateTimeNow, UpdateBy
FROM #tblData
) AS Src
ON (1 = 0)
WHEN NOT MATCHED BY TARGET THEN
INSERT
(DateTimeNow
,UpdateBy)
VALUES
(Src.DateTimeNow
,Src.UpdateBy)
OUTPUT inserted.MasterId, Src.UniqueKey, Src.DateTimeNow
INTO #tblChild(MasterId, UniqueKey, DateTimeNow)
;
检查并清理
select * from #tblData;
select * from #tblMaster;
select * from #tblChild;
DROP TABLE #tblData;
DROP TABLE #tblMaster;
DROP TABLE #tblChild;