Как я могу объединить несколько запросов SQL в одном?(MS SQL) - PullRequest
0 голосов
/ 01 октября 2018

Например, у меня 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?

PS MS SQL не имеет DUPLICATE KEY UPDATE

UPD: или как я могу создать один UPDATE запрос из двух разных запросов (как в примере) ?Что касается INSERT - это проще.Я пытаюсь сократить ~ 200 отдельных запросов до одного или двух запросов.

Ответы [ 2 ]

0 голосов
/ 01 октября 2018

Если это нужно сделать «все или ничего», вы можете добавить транзакции.

BEGIN TRAN

Update 1 
Update 2 
...

COMMIT TRAN

Таким образом, либо все четыре (или более) изменения выполнены, либо ни одно не сделано.

Если, однако, причина вашего вопроса в меньшем количестве кода, возможно, будет полезен синтаксис, подобный приведенному ниже.Или создайте временную таблицу и используйте курсор (sql-версия цикла for, которого я обычно стараюсь избегать из-за производительности).

INSERT INTO table2
SELECT * FROM table1
WHERE condition; 
0 голосов
/ 01 октября 2018

Вы можете объединить два оператора UPDATE в один, используя выражение CASE:

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 only выбиралосьте OrderProductId, которые рассматриваются в выражениях CASE.В противном случае вы установите для столбцов значения NULL для тех идентификаторов, которые вы не обрабатываете в CASE.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...