2011-04-25 75 views

Trả lời

16

Bạn chỉ có thể kết hợp một bản cập nhật với một tuyên bố trường hợp như vậy

UPDATE records 
    SET name = 
    CASE 
     WHEN id = 3 THEN 'abc' 
     WHEN id = 1 THEN 'def' 
     ELSE name 
    END 
+2

Tôi nghĩ rằng bạn nên có một 'where' trên đó, nếu không nó sẽ làm một bản cập nhật trên tất cả các bản ghi trong bảng. – Guffa

+0

@Guffa Bạn có một điểm hợp lệ và tôi đồng ý với điều khoản 'where'. Nhược điểm của điều này là chúng ta cần đảm bảo các điều kiện trong 'case' và' where' là giống nhau. Chắc chắn, giải pháp của tôi cập nhật tất cả các hàng, nhưng đối với các hàng không nằm trong các điều kiện này, chúng được cập nhật từ 'name' thành' name', điều này rõ ràng không thay đổi bất cứ điều gì –

+5

Trong hầu hết các trường hợp, nó không thay đổi bất cứ điều gì, nhưng hãy tưởng tượng rằng có một kích hoạt trên bản cập nhật ghi nhật ký tất cả các hàng đã thay đổi sang một bảng khác ... – Guffa

5
;WITH vals(id, name) 
    AS (SELECT 3,'abc' 
     UNION ALL 
     SELECT 1,'def') 
UPDATE r 
SET name = vals.name 
FROM records r 
     JOIN vals 
     ON vals.id = r.id 
+0

Cảm ơn, đã hoàn thành công việc của tôi từ truy vấn này. –

16

Chỉ với một vài bản ghi, bạn có thể sử dụng:

update records 
set name = case id 
    when 1 then 'def' 
    when 3 then 'abc' 
end 
where id in (1, 3) 

Một chút linh hoạt hơn là tạo ra một kết quả mà bạn có thể tham gia vào các cập nhật:

update r 
set name = x.name 
from records r 
inner join (
    select id = 1, name = 'abc' union all 
    select 3, 'def' union all 
    select 4, 'qwe' union all 
    select 6, 'rty' 
) x on x.id = r.id 
+0

Brilliant! Cảm ơn! –

+2

Tại sao lại là downvote? Nếu bạn không giải thích những gì bạn nghĩ là sai, nó không thể cải thiện câu trả lời. – Guffa

+0

Đây phải là câu trả lời được chấp nhận. –

3

Chuẩn SQL: 2003 cú pháp (hoạt động trên SQL Server 2008 trở đi):

MERGE INTO records 
    USING (
      VALUES (1, 'def'), 
       (3, 'abc') 
     ) AS T (id, name) 
     ON records.id = T.id 
WHEN MATCHED THEN 
    UPDATE 
     SET name = T.name; 

Lưu ý rằng NAMERECORDS là các từ dành riêng cho SQL.

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