【问题标题】:merge statement when not matched by source then insert to another table当源不匹配时合并语句然后插入到另一个表
【发布时间】:2014-02-04 18:46:24
【问题描述】:

我创建了两个表 customersrccustomertemp 与列:

客户温度

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 数据值插入到临时表中,因为它与 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. 可以在when not match by source query里面写insert语句吗?
  2. 如果不可能,那么如何使用merge 来实现这一点?
  3. 在一个简单的集合论中,我需要将customersrc(table_B)-customertemp (table_A) 放入。 B-A 值到另一个或临时表中。

【问题讨论】:

  • 这是一个不寻常的要求。为什么要插入到另一个表?您稍后会将这些数据插入到 customersrc 中吗?
  • no 显示不在 customertemp 表中的用户。

标签: sql sql-server tsql


【解决方案1】:

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

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

如果还需要向第三张表插入数据,根据行是更新还是插入,可以使用合并语句的 OUTPUT 子句。查看文档:http://technet.microsoft.com/en-us/library/ms177564.aspx

【讨论】:

  • 感谢您的快速回复。在一个场景中,匹配时合并具有更新操作(此更新针对表中的所有行),并且当源不匹配时合并具有一些更新操作(此更新针对同一表中的某些行)。是否可以在输出子句中获取与源不匹配时的唯一更新数据。
  • 您可以使用特殊的 $action 列来确定对输出中的每条记录执行了什么操作。
  • $action 列显示所有更新的查询值。即匹配更新条件值和源更新条件值不匹配时。这两个操作都在同一个合并语句中使用。
  • 然后确保还输出isactive 列。这样,$action = 'UPDATE' AND isactive = 0 的所有输出记录都是来自 WHEN NOT MATCHED BY SOURCE 条件的记录。
【解决方案2】:

我:你为什么要插入另一个表?

你:显示不在 customertemp 表中的用户。

所以你的要求是不要插入到另一个表中。您的要求是获取丢失的用户。

您可以使用假人 UPDATE (SET 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

【讨论】:

    猜你喜欢
    • 2012-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-12
    • 1970-01-01
    相关资源
    最近更新 更多