如何将几个SQL查询合并为一个? (MS SQL)

时间:2018-10-01 13:15:41

标签: sql sql-server sql-server-2008

例如,我有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个单独的查询减少到一个或两个查询。

2 个答案:

答案 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