【问题标题】:Data to be updated in database if it exists - else it should insert new records in SQL Server数据库中要更新的数据(如果存在) - 否则它应该在 SQL Server 中插入新记录
【发布时间】:2020-02-25 16:17:09
【问题描述】:

如果数据不存在,我创建了一个插入语句来将数据添加到 DB。

INSERT INTO SampleList(SampleId, Type, Description)
    SELECT nr.SampleId, nr.Type, nr.Description
      FROM (VALUES (1,'A','AA'),
                 (2,'B','BB'),
                 (3,'C','CC'),
                 (4,'D','DD')
           ) AS nr (SampleId,Type,Description) 
      LEFT JOIN SampleList cr ON cr.SampleId = nr.SampleId 
      WHERE cr.SampleId IS NULL

但如果数据库中存在数据,我也想更新行。

你能帮我做吗?

【问题讨论】:

  • 这叫做MERGE
  • 试过这个。但无法正常工作
  • 你能告诉我们你在这个问题上的尝试吗? “不起作用”是什么意思?
  • MERGE SampleList cr USING (SELECT nr.SampleId, nr.Type, nr.Description FROM (VALUES (1,'A','AA'), (2,'B','BB' ), (3,'C','CC'), (4,'D','DD') ) as nr (SampleId, Type, Description)) ON (cr.SampleId=nr.SampleId) 匹配后更新SET cr.Type=nr.Type, cr.Description=nr.Description 当目标不匹配时插入(SampleId、Type、Description)值(nr.SampleId、nr.Type、nr.Description)
  • 上面的命令说语法错误:关键字'ON'附近的语法不正确。

标签: sql database sql-server-2012 automation


【解决方案1】:

你可以使用MERGE

MERGE SampleList cr 
USING (SELECT nr.SampleId, nr.[Type], nr.[Description] 
       FROM (VALUES (1,'A','AA'), (2,'B','BB'), (3,'C','CC'), (4,'D','DD') 
                  ) as nr (SampleId, [Type], [Description])
      ) AS nr -- Use missed alias
       ON (cr.SampleId = a.SampleId) 
WHEN MATCHED THEN 
     UPDATE SET cr.[Type] = nr.[Type], cr.[Description] = nr.[Description] 
WHEN NOT MATCHED BY TARGET THEN 
     INSERT (SampleId, [Type], [Description]) 
        VALUES (nr.SampleId, nr.[Type], nr.[Description]); -- to terminate the merge

但是,您可以仅使用 values 来简化子查询:

MERGE SampleList cr 
USING ( VALUES (1,'A','AA'), (2,'B','BB'), (3,'C','CC'), (4,'D','DD') 
      ) AS nr(SampleId, [Type], [Description]) 
      ON (cr.SampleId = a.SampleId)
WHEN MATCHED THEN 
     UPDATE SET cr.[Type] = nr.[Type], cr.[Description] = nr.[Description] 
WHEN NOT MATCHED BY TARGET THEN 
     INSERT (SampleId, [Type], [Description]) 
        VALUES (nr.SampleId, nr.[Type], nr.[Description]); -- to terminate the merge 

【讨论】:

  • 非常感谢。这按预期运行。你让我开心
猜你喜欢
  • 2016-10-29
  • 2015-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-14
  • 1970-01-01
  • 2019-04-19
  • 1970-01-01
相关资源
最近更新 更多