合并语句与源不匹配,然后插入另一个表

时间:2014-02-04 10:13:41

标签: sql sql-server tsql

我创建了两个表customersrccustomertemp,其中包含以下列:

customertemp

ID  name    age addr    cityid  isactive
34  Gi      24  Chennai     1   1

customersrc

CustomerId  CustomerName    CustomerAge CustomerAddress
1            Gi               24    madurai
2            Pa               23    Tirupur
3            MI               27    Tirupur

现在我需要将pa和mi数据值插入临时表bcz,它与customertemp的行不匹配。并且将更新匹配的行gi数据。

我使用了以下MERGE声明

DECLARE @cityid INT SET @cityid=1

MERGE Temp.dbo.customersrc as src_customer
USING ( SELECT CustomerName,CustomerAge,CustomerAddress FROM customertemp) as temp_customer
ON src_customer.name=temp_customer.CustomerName 
    AND
    src_customer.cityid=@cityid
WHEN MATCHED THEN 
    UPDATE SET 
                src_customer.age=temp_customer.CustomerAge,
                src_customer.addr=temp_customer.CustomerAddress,
                src_customer.isactive=1

WHEN NOT MATCHED BY SOURCE THEN 
     UPDATE SET src_customer.isactive=0 ;  -- here i need the insert statement to insert in another table

问题:

  1. 是否可以在源查询不匹配时写入insert语句?
  2. 如果不可能,那么如何使用merge
  3. 来实现这一目标
  4. 在一个简单的集理论中我需要把customersrc(table_B)-customertemp(table_A)。 B-A值进入另一个或临时表。

2 个答案:

答案 0 :(得分:2)

MERGE声明的主要用途之一是执行所谓的“UPSERTS”(更新匹配记录,插入新记录),因此绝对可以做你想要的。只需将以下内容添加到MERGE语句的最后一部分:

WHEN NOT MATCHED BY TARGET THEN 
    INSERT (name, age, addr, cityid, isactive)
    VALUES (CustomerName, CustomerAge, CustomerAddress, @cityid, 1)

如果还需要将数据插入第3个表,则根据行是否更新或插入,可以使用merge语句的OUTPUT子句。查看文档:{​​{3}}

答案 1 :(得分:0)

  

我:你为什么要插入另一张桌子?

     

您:显示不在客户表中的用户。

所以你的要求是不要插入另一个表。您的要求是让失踪的用户。

您可以使用虚拟UPDATESET SomeCol = SomeCol)和OUTPUT执行此操作。但这是我试图避免的黑客攻击。

在两个陈述中这样做可能更容易。这是你如何获得缺失的行:

SELECT temp_customer.*
FROM (SELECT CustomerName,CustomerAge,CustomerAddress FROM customertemp) as temp_customer
LEFT JOIN customersrc ON src_customer.name=temp_customer.CustomerName AND src_customer.cityid=@cityid
WHERE customersrc.cityid IS NULL
相关问题