2017-08-28 24 views
5

Tôi cần cập nhật thông tin mô tả cho từng mã tỉnh trong bảng Tỉnh. Những gì tôi đang làm là:Có cách nào để hợp nhất nhiều truy vấn cập nhật vào một truy vấn không?

update Provinces 
set Description='Mississippi' 
where Code = 'MS' 

update Provinces 
set Description = 'Maryland' 
where Code = 'MD' 

.... --around 100 more update queries like that. 

Bằng cách này, có một dòng mã lặp lại, trông không tốt cho tôi. Tôi tự hỏi liệu có cách nào tốt hơn và chuyên nghiệp hơn để thực hiện nhiệm vụ tương tự không. Bất kỳ trợ giúp hoặc cố vấn sẽ được đánh giá cao.

Trả lời

11

Bạn có thể sử dụng CASE:

update Provinces 
set Description= CASE code WHEN 'MS' THEN 'Mississippi' 
          WHEN 'MD' THEN 'Maryland' 
          -- ELSE 'some default value' --otherwise NULL 
       END 
where Code IN('MS', 'MD'); 

Một cách khác là để tạo ra biến bảng và sử dụng UPDATE FROM JOIN cú pháp:

DECLARE @t AS (code VARCHAR(10), desc VARCHAR(1000)); 
INSERT INTO @t(code, desc) VALUES ('MS','Mississippi'), ('MD', 'Maryland'); 

UPDATE p 
SET desc = t.desc 
FROM Provinces p 
JOIN @t t 
    ON p.Code = t.code; 
6

Một thay thế cho việc sử dụng case biểu hiện là sử dụng một common table expression với a table value constructor và tham gia vào số cte như sau:

;with ProvinceDescription as (
    select Description, Code 
    from (values 
     ('Mississippi','MS') 
    ,('Maryland','MD') 
    ) v (Description, Code) 
) 
update p 
    set p.Description = pd.Description 
from Provinces p 
    inner join ProvinceDescription pd 
    on p.Code = pd.Code 
where p.Description <> pd.Description; 
+1

Hoặc bỏ qua CTE và chỉ 'bên tham gia (các giá trị ('Mississippi', 'MS'), ('Maryland ',' MD ')) dưới dạng ProvinceDescription (Mô tả, Mã) trên ProvinceDescription.Code = p.Code'. – HABO

+0

@Habo Đúng, tôi thích cte hơn vì tôi nghĩ nó làm tăng khả năng đọc. – SqlZim

0

Nếu bạn có ép duy nhất của bạn thiết lập đúng cách, bạn có thể sử dụng:

INSERT INTO Provinces (Description, Code) 
VALUES ('Maryland', 'MD'), ('Mississippi', 'MS') 
ON DUPLICATE KEY UPDATE Description=VALUES(Description), Code=VALUES(Code) 
+2

'Microsoft SQL Server'! =' MySQL' Ngoài ra nó không giải quyết trường hợp OP. – lad2025

Các vấn đề liên quan