【问题标题】:Insert New Records Into Table Using If/Else Statement使用 If/Else 语句将新记录插入表中
【发布时间】:2019-03-27 22:58:52
【问题描述】:

我有两个 SQL Server 表,我需要将记录从一个表添加到下一个表。如果目标表中已经存在唯一标识符,则将记录更新为来自源表的数据 - 如果唯一标识符不存在,则将整个新记录插入目标表中。

我似乎已经让我更新目标表中记录的初始部分开始工作,但我将插入新记录的部分似乎没有工作。

if exists (
   select 1
   from SCM_Top_Up_Operational O
   join SCM_Top_Up_Rolling R ON O.String = R.string
)
begin

   update O
   set    O.Date_Added = R.Date_Added,
          O.Real_Exfact = R.Real_Exfact,
          O.Excess_Top_Up = R.Excess_Top_Up 
   from  SCM_Top_Up_Operational O 
   join  SCM_Top_Up_Rolling R on O.String = R.String
   where O.String = R.string and R.date_added > O.date_added

end

else 

begin
   insert into SCM_Top_Up_Operational (String,Date_Added,Real_Exfact,Article_ID,Excess_Top_Up,Plant)
   select String,Date_Added,Real_Exfact,Article_ID,Excess_Top_Up,Plant
   from SCM_Top_Up_Rolling
end

【问题讨论】:

    标签: sql-server tsql sql-update sql-insert


    【解决方案1】:

    如果我没听错的话,你应该可以通过一个 SQL 查询来解决这个问题,使用 SQL Server MERGE syntax,自 SQL Server 2008 起可用。

    来自文档:

    根据与源表的连接结果对目标表运行插入、更新或删除操作。例如,通过根据在另一个表中发现的差异在一个表中插入、更新或删除行来同步两个表。

    考虑以下查询:

    MERGE 
        SCM_Top_Up_Operational O 
        USING SCM_Top_Up_Rolling R ON (O.String = R.string)
    WHEN MATCHED 
        THEN UPDATE SET 
            O.Date_Added    = R.Date_Added,
            O.Real_Exfact   = R.Real_Exfact,
            O.Excess_Top_Up = R.Excess_Top_Up 
    WHEN NOT MATCHED BY TARGET 
        THEN INSERT (  String,   Date_Added,   Real_Exfact,   Article_ID,   Excess_Top_Up,   Plant)
             VALUES (R.String, R.Date_Added, R.Real_Exfact, R.Article_ID, R.Excess_Top_Up, R.Plant)
    

    【讨论】:

    • 漂亮。我每天都在 SQL 中工作,甚至都不知道这是一回事,因为我使用的数据库是从 2008 年之前开始更新的。
    • 我认为这是答案,但我收到一个错误,我需要改进 ON 子句,因为“MERGE 语句已多次尝试更新或删除同一记录”我确实有源表中相同字符串的两个实例,这是故意的 - 想法是使用该字符串记录的最新实例更新目标表。这是 MERGE 可以处理的吗?我会说源表由记录 ID 键入,该记录 ID 是表上唯一的唯一标识符。再次感谢。
    猜你喜欢
    • 2019-05-28
    • 2018-03-30
    • 2019-04-09
    • 1970-01-01
    • 1970-01-01
    • 2015-08-18
    • 1970-01-01
    • 2014-09-07
    • 1970-01-01
    相关资源
    最近更新 更多