【问题标题】:Merge query in SQL Server 2008SQL Server 2008 中的合并查询
【发布时间】:2011-06-28 06:54:45
【问题描述】:

我有将数据从源表加载到目标表的场景。如果目标中不存在来自源的数据,那么我需要插入。如果它已经存在于目标表中,则将该行的状态更新为“过期”并将该列作为新行插入。我使用合并查询来做到这一点。如果不存在,我可以插入,我也可以更新。但是在尝试在匹配时插入时,它说在“匹配时”子句中不允许插入。 请帮助我..提前谢谢

【问题讨论】:

  • 向我们展示你已经拥有的东西!!并解释你的桌子是什么样子的!!

标签: sql-server merge


【解决方案1】:

如果您想对单行源数据执行多个操作,则需要以某种方式复制该行。

类似于以下内容(组成表名等):

;WITH Source as (
    SELECT Col1,Col2,Col3,t.Dupl
    FROM SourceTable,(select 0 union all select 1) t(Dupl)
)
MERGE INTO Target t
USING Source s ON t.Col1 = s.Col1 and s.Dupl=0 /* Key columns here */
WHEN MATCHED THEN UPDATE SET Expired = 1
WHEN NOT MATCHED AND s.Dupl=1 THEN INSERT (Col1,Col2,Col3) VALUES (s.Col1,s.Col2,s.Col3);

您总是希望在不匹配的分支中使用 s.Dupl 条件,否则不匹配任何目标行的源行将被插入两次。


根据您作为评论发布的示例,我会更改:

MERGE target AS tar USING source AS src ON src.id = tar.id
WHEN MATCHED THEN UPDATE SET D_VALID_TO=@nowdate-1, C_IS_ACTIVE='N', D_LAST_UPDATED_DATE=@nowdate
WHEN NOT MATCHED THEN INSERT (col1,col2,col3) VALUES (tar.col1,tar.col2,tar.col3); 

进入:

;WITH SourceDupl AS (
    SELECT id,col1,col2,col3,t.Dupl
    FROM source,(select 0 union all select 1) t(Dupl)
)
MERGE target AS tar USING SourceDupl as src on src.id = tar.id AND Dupl=0
WHEN MATCHED THEN UPDATE SET D_VALID_TO=@nowdate-1, C_IS_ACTIVE='N', D_LAST_UPDATED_DATE=@nowdate
WHEN NOT MATCHED AND Dupl=1 THEN INSERT (col1,col2,col3) VALUES (src.col1,src.col2,src.col3);

我更改了 VALUES 子句中的值,因为在 NOT MATCHED 分支中,tar 表没有可供从中选择值的行。

【讨论】:

  • 'WHEN NOT MATCHED' 可以在我第一次来插入数据时执行。下次,当数据存在时,它会执行更新,对于插入,您希望我使用之前声明的相同的“WHEN NOT MATCHED”子句......合并是否不允许 2 个“WHEN NOT MATCHED”子句。我可以做点什么来区分'WHEN NOT MATCHED'子句
  • @user549903 - 我不确定你现在要什么。在我展示的语句中,如果目标表中有匹配的行,则 UPDATE 和 INSERT 都会发生。
  • 合并目标作为 tar 使用源作为 src ON src.id = tar.id 匹配时然后更新集 D_VALID_TO=@nowdate-1, C_IS_ACTIVE='N', D_LAST_UPDATED_DATE=@nowdate 当不匹配时插入 (col1,col2,col3) 值 (tar.col1,tar.col2,tar.col3);
  • 根据我的要求,如果匹配,则需要进行更新和插入。如果不匹配,则只需插入
  • Damien,感谢一百万的帮助。它更新了行。但它不是在匹配时插入一行。
【解决方案2】:

查看众多链接之一:

如果不知道您的数据库表是什么样子,我们无法提供更多帮助 - 您需要阅读这些文章并弄清楚如何将其应用于您的具体情况。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-20
    • 1970-01-01
    • 1970-01-01
    • 2011-07-08
    • 1970-01-01
    • 1970-01-01
    • 2011-10-01
    相关资源
    最近更新 更多