单个源表中的主子表条目

时间:2016-09-13 12:41:45

标签: sql sql-server

我有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)

2 个答案:

答案 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)

在这种简单的情况下,不需要光标。

您可以将MERGEOUTPUT子句一起使用。 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;