2013-02-27 56 views
12

Tôi đang sử dụng SQL Server và cố gắng sử dụng SQL để cập nhật nhiều bảng cùng một lúc với một truy vấn:Cập nhật nhiều bảng trong SQL Server sử dụng INNER JOIN

Các truy vấn sau đây:

update table1 
set A.ORG_NAME = @ORG_NAME, B.REF_NAME = @REF_NAME 
from table1 A, table2 B 
where B.ORG_ID = A.ORG_ID 
and A.ORG_ID = @ORG_ID 

Cung cấp cho các thông báo lỗi:

Mã định danh nhiều phần "A.ORG_NAME" không thể bị ràng buộc.

Thông báo lỗi có nghĩa là gì?

+2

Không như thế nào? Thông báo lỗi? Chỉ cần không cập nhật những gì bạn muốn? –

+4

'UPDATE' sang một bên, làm ơn, làm ơn, làm ơn đừng viết kiểu cũ tham gia. Sử dụng cú pháp 'INNER JOIN' thích hợp. http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick-using-old-style-joins.aspx –

Trả lời

20

Bạn không thể cập nhật hơn một bảng trong một tuyên bố duy nhất, tuy nhiên các thông báo lỗi bạn nhận được là vì các bí danh, bạn có thể thử này:

BEGIN TRANSACTION 

update A 
set A.ORG_NAME = @ORG_NAME 
from table1 A inner join table2 B 
on B.ORG_ID = A.ORG_ID 
and A.ORG_ID = @ORG_ID 

update B 
set B.REF_NAME = @REF_NAME 
from table2 B inner join table1 A 
    on B.ORG_ID = A.ORG_ID 
    and A.ORG_ID = @ORG_ID 

COMMIT 
+0

Cảm ơn. Thực hành tốt để đặt từ khóa 'end' sau' commit'? hoặc là không cần thiết? – Coyolero

+3

* BEGIN TRANSACTION * là không giống như * BEGIN * mà bắt đầu một khối (được sử dụng trong * NẾU * ví dụ). Vì vậy, không sử dụng * END *, đây không phải là một câu hỏi thậm chí thực hành tốt hay xấu, bạn có thể đóng khối bạn đang ở và tìm ra bất ngờ tuyên bố – jazzytomato

10

Bạn có thể cập nhật với một tham gia nếu bạn chỉ ảnh hưởng đến một bảng như sau:

UPDATE table1 
SET table1.name = table2.name 
FROM table1, table2 
WHERE table1.id = table2.id 
AND table2.foobar ='stuff' 

Nhưng bạn đang cố gắng ảnh hưởng đến nhiều bảng có câu lệnh cập nhật tham gia trên nhiều bảng. Chuyện đó không thể xảy ra được.

Tuy nhiên, việc cập nhật hai bảng trong một tuyên bố thực sự là có thể nhưng sẽ cần phải tạo ra một Xem cách sử dụng một UNION có chứa cả các bảng bạn muốn cập nhật. Sau đó, bạn có thể cập nhật Chế độ xem mà sau đó sẽ cập nhật các bảng cơ bản.

SQL JOINS

Nhưng đây là một tiệm lừa thực sự hacky, sử dụng các giao dịch và nhiều thông tin cập nhật, đó là trực quan hơn nhiều.

+3

in đậm của bạn là không hoàn toàn đúng. Bạn có thể cập nhật một bảng dựa trên một tham gia, bạn chỉ có thể không có bản cập nhật * ảnh hưởng * nhiều bảng. Và tôi đồng ý về việc hack-i-ness của liên kết được đề xuất (thậm chí tôi có thể đề xuất xóa nó). Có thực sự đáng làm tất cả những điều đó để tránh viết hai câu? –

+0

Liên kết không mô tả cách sử dụng công đoàn, có thể đó là một bài đăng khác từ blog đó? –

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