我创建了两个表customersrc
和customertemp
,其中包含以下列:
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
问题:
merge
?答案 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)
我:你为什么要插入另一张桌子?
您:显示不在客户表中的用户。
所以你的要求是不要插入另一个表。您的要求是让失踪的用户。
您可以使用虚拟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