2012-06-28 29 views
13

tôi có các bảng và các giá trị:Cập nhật nhiều hàng sử dụng lựa chọn công bố

Table1 
------------------------ 
ID | Value 
------------------------ 
2 | asdf 
4 | fdsa 
5 | aaaa 


Table2 
------------------------ 
ID | Value 
------------------------ 
2 | bbbb 
4 | bbbb 
5 | bbbb 

Tôi muốn cập nhật tất cả các giá trị trong Table2 sử dụng các giá trị trong Table1 với tương ứng của ID của họ.

Có cách nào để thực hiện điều đó bằng truy vấn SQL đơn giản không?

+4

có thể trùng lặp với [SQL Server UPDATE from SELECT] (http://stackoverflow.com/questions/2334712/sql-server -update-from-select) – RedFilter

Trả lời

33

Chạy một lựa chọn để chắc chắn rằng nó là những gì bạn muốn

SELECT t1.value AS NEWVALUEFROMTABLE1,t2.value AS OLDVALUETABLE2,* 
FROM Table2 t2 
INNER JOIN Table1 t1 on t1.ID = t2.ID 

Cập nhật

UPDATE Table2 
SET Value = t1.Value 
FROM Table2 t2 
INNER JOIN Table1 t1 on t1.ID = t2.ID 

Ngoài ra, xem xét sử dụng BEGIN TRAN để bạn có thể cuộn nó lại nếu cần thiết, nhưng chắc chắn rằng bạn COMMIT nó khi bạn hài lòng.

6

Nếu bạn có id trong cả hai bảng, các công việc sau:

update table2 
    set value = (select value from table1 where table1.id = table2.id) 

Có lẽ một cách tiếp cận tốt hơn là một tham gia:

update table2 
    set value = table1.value 
    from table1 
    where table1.id = table2.id 

Lưu ý rằng cú pháp này hoạt động trong SQL Server nhưng có thể khác nhau trong các cơ sở dữ liệu khác.

1

Bạn có thể sử dụng bí danh để cải thiện truy vấn:

UPDATE t1 
    SET t1.Value = t2.Value 
    FROM table1 AS t1 
     INNER JOIN 
     table2 AS t2 
     ON t1.ID = t2.ID 
0

Tôi đã sử dụng này trên MySQL, MS Access và SQL Server. Các trường id là các trường mà trên đó các bảng trùng khớp, không phải là chỉ mục chính.

UPDATE DestTable INNER JOIN SourceTable ON DestTable.idField = SourceTable.idField SET DestTable.Field1 = SourceTable.Field1, DestTable.Field2 = SourceTable.Field2... 
0
SET SQL_SAFE_UPDATES = 0; 
UPDATE m1,m2 
SET m1.code = m2.code 
WHERE 
    m1.name = (select distinct m2.name from m2 limit 1); 

Ở đây, updation đang palce trong m1.code, nơi condtion đang tìm kiếm tất cả các bản ghi trong truy vấn phụ và trả lại tất cả các rows.I phù hợp sử dụng hạn từ 1 tới trả lại một thay vì bản sao. Bạn có thể sử dụng riêng biệt hoặc giới hạn 1 hoặc đầu 1 hoặc có số Sry, cho tiếng Anh của tôi

+1

Vui lòng thêm một số mô tả cho mã. @ HariKishore –

+1

Cảm ơn bạn đã trích đoạn mã này, đoạn mã này có thể cung cấp một số trợ giúp ngay lập tức. Một lời giải thích thích hợp [sẽ cải thiện rất nhiều] (// meta.stackexchange.com/q/114762) giá trị giáo dục của nó bằng cách hiển thị * tại sao * đây là một giải pháp tốt cho vấn đề, và sẽ hữu ích hơn cho các độc giả tương lai tương tự, nhưng không giống nhau, câu hỏi. Vui lòng [sửa] câu trả lời của bạn để thêm giải thích và đưa ra chỉ dẫn về những giới hạn và giả định được áp dụng. –

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