【问题标题】:update from one table to another if doesnt exist in the original table in sql server 2005如果在 sql server 2005 的原始表中不存在,则从一个表更新到另一个表
【发布时间】:2011-07-17 10:56:48
【问题描述】:

我有 2 个具有相同列的表 - T1、T2。我想根据键列从 T2 中存在的列更新表 T1 列:如果键列存在,则从 T2 更新 T1 的其余列,如果不存在,则将整行从 T2 插入到 T1 .

这个查询不起作用:

IF EXISTS (SELECT keyC FROM T2 WHERE keyC in (select keyC from T1)) 
UPDATE T1 SET T1.c1 = T2.c1,
T1.c2 = T2.c2,
from  T2 WHERE  T2.keyC in (select keyC from T1)
ELSE (INSERT INTO T1 select * from T2)

知道怎么解决吗?

提前致谢,

格雷格

【问题讨论】:

  • 您是否需要将其作为单个语句执行,因为它不能在一个语句中完成

标签: sql-server-2005 insert exists


【解决方案1】:

由于您使用的是 SQL Server 2005,因此您不能使用合并,而必须执行两条语句。一更新一插入。

declare @T1 table (keyC int, c1 int)
declare @T2 table (keyC int, c1 int)

insert into @T1 values (1, 1)

insert into @T2 values (1, 10)
insert into @T2 values (2, 20)

-- Update all rows
update @T1 set
  c1 = T2.c1
from @T1 as T1
  inner join @T2 as T2
    on T1.keyC = T2.keyC

-- Insert new rows
insert into @T1 (keyC, c1)
select keyC, c1
from @T2 as T2
where not exists (select *
                  from @T1 as T1
                  where T1.keyC = T2.keyC)

【讨论】:

    【解决方案2】:

    在 SQL2008 中你可以使用优雅的 MERGE 语句:

    MERGE T1 AS target
    USING T2 AS source ON (target.KeyC = source.KeyC)
    WHEN MATCHED THEN 
        UPDATE SET  c1 = source.c1,
                    c2 = source.c2
    WHEN NOT MATCHED THEN   
        INSERT (c1, c2)
        VALUES (source.c1, source.c2);
    

    【讨论】:

      【解决方案3】:

      对于 SQL Server 2008,看看使用 MERGE 语句。

      MERGE T1 AS target
      USING T2 AS source
      ON (target.keyC = source.keyC)
      WHEN MATCHED THEN 
          UPDATE SET c1 = source.c1, c2 = source.c2
      WHEN NOT MATCHED THEN   
          INSERT (keyC, c1, c2)
          VALUES (source.keyC, source.c1, source.c2)
      

      编辑:OP 将问题从 2008 年更改为 2005 年

      对于早期版本,您需要 2 个操作:

      UPDATE target
          SET c1 = source.c1, c2 = source.c2
          FROM T1 AS target
              INNER JOIN T2 as source
                  ON target.keyC = source.keyC
      
      INSERT INTO T1
          (keyC, c1, c2)
          SELECT keyC, c1, c2
              FROM T2
              WHERE NOT EXISTS(SELECT NULL FROM T1 WHERE keyC = T2.keyC)
      

      【讨论】:

        猜你喜欢
        • 2014-04-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-01-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-12
        相关资源
        最近更新 更多