选择中的升序

时间:2018-07-04 12:56:40

标签: sql sql-server upsert

我需要从this之类的select中执行upsert,但是在SQL Server中。我发现有人在SQL Server here中进行了upsert,但这并非来自选择。

我的查询现在基本上看起来像这样:

INSERT INTO (table1) (...)
    SELECT (...)
    FROM (table 2)
    WHERE X NOT IN (SELECT Y from (table1) WHERE Y IS NOT NULL)

但是我不知道如何添加更新部分。我想在99%的时间之后将其作为插入内容来添加更新部分。

编辑:如果我能够通过SELECT进行操作,此代码将起作用:

BEGIN TRY
    INSERT INTO table1 (id, name, itemname, itemcatName, itemQty)
    VALUES ('val1', 'val2', 'val3', 'val4', 'val5')
END TRY
BEGIN CATCH
    UPDATE table1 
    SET name = 'val2', 
        itemname = 'val3', 
        itemcatName = 'val4', 
        itemQty = 'val5'
    WHERE id = 'val1'
END CATCH

4 个答案:

答案 0 :(得分:1)

我想应该保持相同的思路

update t1
set ......
from table1 t1
inner join table2 on t1.Y=table2.X

请注意,已更新表必须使用别名,以便基于联接进行更新。

或者,您可以环顾四周(或等待答案)以获取MERGE。只需声明就可以进行upsert这样的操作,这是非常优雅的,但是我还没有得出结论,可能的不利之处是否值得。

答案 1 :(得分:0)

update table1 
  set name = 'val2', itemname = 'val3', itemcatName = 'val4', itemQty = 'val5'
  where id = 'val1'

IF @@ROWCOUNT = 0
insert into table1(id, name, itemname, itemcatName, itemQty)
  values('val1', 'val2', 'val3', 'val4', 'val5')

执行UPSERT: http://en.wikipedia.org/wiki/Upsert

答案 2 :(得分:0)

如果您想INSERT(如果一条记录不存在)或UPDATE(如果有),请尝试此操作

IF EXISTS (SELECT 1 FROM table1 WHERE somecol = @someval)
BEGIN
    UPDATE T1
    SET T1.someCol1 = T2.someCol1
        ,T1.someCol2 = T2.someCol2 
         --, etc,  etc
    FROM table1 T1
    INNER JOIN table2 T2 ON T1.Id = T2.T1_FK
END
ELSE
BEGIN
    INSERT INTO table1 (someCol, someCol2 --,etcetc)
    SELECT T2.someCol1, T2.someCol2 --etc etc
    FROM table2 T2
    WHERE somecol = @someval
END

答案 3 :(得分:0)

先进行更新

update t1
SET (...)
FROM (table2) t2
JOIN table1 t1 WHERE t1.Y = t2.X


INSERT INTO (table1) (...)
SELECT (...)
FROM (table2) t2
WHERE NOT EXISTS (SELECT 1 from table1 WHERE Y = t2.X)