【问题标题】:Inserting multiple rows with Merge NOT MATCHED使用 Merge NOT MATCHED 插入多行
【发布时间】:2017-01-24 00:51:46
【问题描述】:
MERGE tbl_target t
USING tbl_source s
ON t.itemnum = s.itemnum
WHEN NOT MATCHED 
    INSERT (itemnum, minqty, maxqty, parent)
    VALUES (s.itemnum,0,99,10),(s.itemnum,0,99,80);

如果项目在目标上不存在但在源上存在,我正在尝试在目标表上插入两行。每次我尝试 SQL 服务器都会在 VALUES 之间的“,”上给出错误。

MERGE 语句必须以分号 (;) 结束

是否可以在 MERGE 语句中进行多行插入?

【问题讨论】:

    标签: sql-server tsql merge


    【解决方案1】:

    我从msdn 了解到的是,您只能为每个不匹配的记录插入一行。你需要使用合并吗?如果没有,以下将起作用

    WITH CTE (Sitemnum) 
    AS 
    (
        SELECT s.itemnum
        FROM tbl_source s
        LEFT JOIN tbl_target t ON (s.itemnum = t.itemnum)
        WHERE t.itemnum IS NULL
    )
    INSERT tbl_target
    SELECT Sitemnum,0,99,10 
    FROM CTE
    UNION 
    SELECT Sitemnum,0,99,80
    FROM CTE
    

    【讨论】:

      【解决方案2】:

      可以通过调整USING 子句来为每个tbl_source.itemnum 值返回多行:

      MERGE tbl_target t
      USING (
        select s.itemnum, 
               0 as minqty, 
               99 as maxqty,
               p.parent 
          from tbl_source s
          cross join (
            select 10 as parent
            union all
            select 80 as parent) p
      ) s
      ON t.itemnum = s.itemnum
      WHEN NOT MATCHED THEN
          INSERT (itemnum, minqty, maxqty, parent)
          VALUES (s.itemnum,s.minqty,s.maxqty,s.parent);
      

      【讨论】:

      • 工作,不确定我是否会保留解决方案,因为在尝试具有更多列的真实表时它会变得非常混乱,但这绝对是我的问题的正确解决方案.谢谢
      猜你喜欢
      • 1970-01-01
      • 2014-10-16
      • 1970-01-01
      • 2016-01-15
      • 2017-02-13
      • 2013-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多