例如,我有4个查询(其中2个带有更新,而2个带有插入)。
-- Query 1
UPDATE OrderProduct
SET Quantity = Quantity + 2,
TotalCost = (Quantity + 2) * Price
WHERE OrderProductId = 3333
-- Query 2
UPDATE OrderProduct
SET Quantity = Quantity + 5,
TotalCost = (Quantity + 5) * Price
WHERE OrderProductId = 4444
-- Query 3
INSERT INTO OrderProduct (ProductName, Quantity, Price, TotalCost)
VALUES ('Some Product', 3, 5.99, 3*5.99);
-- Query 4
INSERT INTO OrderProduct (ProductName, Quantity, Price, TotalCost)
VALUES ('Some Other Product ', 10, 1.99, 10*1.99);
我可以在一个查询语句中加入它吗?也许是UNION
?
P.S。 MS SQL尚未DUPLICATE KEY UPDATE
UPD:或者如何从两个不同的查询中创建一个UPDATE
查询(如示例中所示)?至于INSERT
-这很容易。我尝试将200个单独的查询减少到一个或两个查询。
答案 0 :(得分:1)
如果必须“全部或不执行”,则可以添加交易。
BEGIN TRAN
Update 1
Update 2
...
COMMIT TRAN
通过这种方式,所有四个(或更多)更改都已完成,或者都没有完成。
但是,如果您提出问题的原因是更少的代码,则如下所示的语法可能会有用。或创建一个临时表并使用一个游标(由于性能,我通常尝试避免使用for循环的sql版本)。
INSERT INTO table2
SELECT * FROM table1
WHERE condition;
答案 1 :(得分:0)
您可以使用CASE表达式将两个UPDATE语句组合为一个:
UPDATE OrderProduct
SET Quantity = case OrderProductId
when 3333 then Quantity + 2
when 4444 then Quantity + 5
end,
TotalCost = case OrderProductId
when 3333 then (Quantity + 2) * Price
when 4444 then (Quantity + 5) * Price
end
WHERE OrderProductId in (3333,4444);
编写CASE表达式的方式,重要的是WHERE子句仅 选择CASE表达式中要处理的OrderProductId。否则,将您在CASE中未处理的ID的列值设置为NULL
。