SQL - 从源到目标表的更新/插入

时间:2017-11-08 19:26:45

标签: sql sql-update sql-insert

我有一个名为STG的源表,需要与名为MAP的目标表“合并”。

STG
ID1    HASH    TIME
A     123     12:01AM
A     456     12:05AM
A     789     12:10AM
B     123     12:15AM
B     789     12:20AM
C     987     12:25AM

MAP
ID1   ID2     HASH    TIME
A     A       123     11:55PM
ID1中的

MAP可以使用与STG中相同的列值 ID2的值由MAP第一次看到ID1HASH组合确定。例如,如果要将第4行B 123 12:15AM作为单行插入MAP,由于B A 123 12:15AM值{{HASH,因此它看起来像123 1}}已经在MAP中,因此使用A ID2的现有值。

目标:将STG中的所有行合并到MAP中并使用相应的ID2值。

例:

    {li>

    ID1存在MAPHASH存在MAPUPDATE(MAP.TIME = STG.TIME)

  1. ID1 DNE MAPHASH DNE MAPINSERT(STG.ID1, STG.ID1, STG.HASH, STG.TIME)

  2. ID1存在MAPHASH DNE MAPINSERT(STG.ID1, MAP.ID2, STG.HASH, STG.TIME)
  3. ID1 DNE MAPHASH存在MAPINSERT(STG.ID1, MAP.ID2, STG.HASH, STG.TIME)
  4. 以这种方式解决问题的问题是STG中的某些行彼此依赖。例如,我运行了执行Case 2的SQL代码,因为ID1中不存在HASHMAP,所以将插入第5行,但第4行与{ {1}}通过MAPHASH

    案例1和案例2,是直截了当且显而易见的。在考虑依赖性的同时解决案例3和4已经证明是困难的。

    如何解决案例3和案件4?

    (正确的)最终结果应如下所示......

    123

1 个答案:

答案 0 :(得分:1)

你可以使用它。

DECLARE @STG TABLE (ID1 VARCHAR(5),   [HASH]  INT,  [TIME] TIME)
INSERT INTO @STG VALUES
('A',123,'12:01AM'),
('A',456,'12:05AM'),
('A',789,'12:10AM'),
('B',123,'12:15AM'),
('B',789,'12:20AM'),
('C',987,'12:25AM')

DECLARE @MAP TABLE (ID1 VARCHAR(5), ID2 VARCHAR(5),   [HASH]  INT,  [TIME] TIME)
INSERT INTO @MAP 
VALUES
('A','A',123,'11:55PM')


;MERGE @MAP AS tar
USING (
        SELECT S.ID1, COALESCE(M.ID1, S.ID1) ID2 , S.HASH, S.TIME 
        FROM @STG S
            LEFT JOIN @MAP M ON (S.HASH = M.HASH OR S.ID1 = M.ID1)
        ) AS src (ID1, ID2, [HASH], [TIME])
ON (tar.ID1 = src.ID1 AND tar.[HASH] = src.[HASH])
WHEN MATCHED THEN
    UPDATE SET [TIME] = src.[TIME]
WHEN NOT MATCHED THEN
    INSERT (ID1, ID2, [HASH], [TIME])
    VALUES (src.ID1, src.ID2, src.[HASH], src.[TIME]) ;

结果:

ID1   ID2   HASH        TIME
----- ----- ----------- ----------------
A     A     123         00:01:00.0000000
A     A     456         00:05:00.0000000
A     A     789         00:10:00.0000000
B     A     123         00:15:00.0000000
B     B     789         00:20:00.0000000
C     C     987         00:25:00.0000000