首页 > 解决方案 > INSERT INTO,如果已经存在 UPDATE。从现有查询。被放在 SQL 代理工作上

问题描述

我会尽量说清楚。

我有一个查询来提取数据:

select typ_no_store as IDstore, str_name as 'name', (CASE WHEN str_addr2 IS NULL THEN str_addr1 ELSE str_addr2 END) as adresse, str_postal as postalcode 
    from store_type inner join STRFIL on typ_no_store = str_store_no
    where typ_code = 'a'

这将导致这样的事情:

001 Newy store          600 BLVD someht                 G11111    
002 LA store            770 BLVD ests                   G22222    
010 Texas store         112 dsntexists                  G33333   

我需要将此结果的持续更改放入一个新表中。我创建了一个具有相同列值的表名“Webstore”。(IDstore、姓名、地址、邮政编码)

我需要一个查询,它将查询结果插入或更新(如果 ID 已经存在)到新表中。该查询将在 SQL Server 代理上每 2 小时运行一次。

我尝试了像 IF EXIST、ON DUPLICATE KEY 和 MERGE 这样的命令,但我无法让它工作。似乎因为我必须从查询中提取数据,而不是从输入的值或整个表中提取数据,所以它不起作用。

任何想法 ?

(对不起,如果我的英语不清楚,请不要犹豫,提问谢谢!)

标签: sql-server

解决方案


您可以在 sql server 中使用 MERGE。

;WITH cte
AS
(
  SELECT typ_no_store as IDstore, 
    str_name as 'name', 
    (CASE WHEN str_addr2 IS NULL THEN str_addr1 ELSE str_addr2 END) as adresse, 
    str_postal as postalcode
  FROM store_type
  INNER JOIN STRFIL on typ_no_store = str_store_no
  WHERE typ_code = 'a'
)

MERGE Webstore AS t
USING cte AS s
ON t.IDstore=s.IDstore
WHEN MATCHED THEN UPDATE
  SET t.[name]=s.name,
      t.other fields = s.other fields ...
WHEN NOT MATCHED BY TARGET THEN
  INSERT (IDstore, other fields...)
  VALUES(s.IDstore, s.other fields)
;

推荐阅读