Trong hầu hết các trường hợp, cập nhật SQL được thực hiện bằng cách sử dụng tham chiếu trực tiếp vào một bảng cụ thể (UPDATE books SET books.title = 'The Hobbit' WHERE books.id = 1
). Tuy nhiên, đôi khi, việc thay đổi nội dung của bảng gián tiếp có thể có lợi , bằng cách sử dụng một tập hợp con dữ liệu thu được từ câu lệnh truy vấn phụ.
Thực hiện UPDATE
sử dụng SELECT
phụ câu lệnh có thể được thực hiện theo một trong hai cách, chủ yếu tùy thuộc vào phiên bản SQL Server bạn đang sử dụng. Chúng tôi sẽ khám phá ngắn gọn cả hai tùy chọn để bạn có thể tìm thấy tùy chọn nào phù hợp nhất với mình.
Sử dụng THAM GIA BÊN TRONG
Đối với tất cả cài đặt SQL Server, phương pháp cơ bản nhất để thực hiện hành động này là sử dụng INNER JOIN
, theo đó các giá trị trong các cột của hai bảng khác nhau được so sánh với nhau.
UPDATE
books
SET
books.primary_author = authors.name
FROM
books
INNER JOIN
authors
ON
books.author_id = authors.id
WHERE
books.title = 'The Hobbit'
Trong ví dụ trên, chúng tôi đang UPDATING
books.primary_author
trường phù hợp với authors.name
cho ‘The Hobbit’ của JOINING
cả hai bảng trong truy vấn với các giá trị phù hợp, tương ứng của authors.id
và books.author_id
.
Sử dụng MERGE để CẬP NHẬT và CHÈN đồng thời
Đối với SQL Server 2008 và mới hơn, Microsoft đã giới thiệu MERGE
đặc biệt hữu ích hoạt động tương tự như INNER JOIN
ở trên nhưng MERGE
cố gắng thực hiện cả UPDATE
và một INSERT
cùng nhau chỉ huy. Điều này đồng bộ hóa hiệu quả hai bảng dựa trên truy vấn được thực hiện, cập nhật và chèn các bản ghi khi cần thiết để hai bảng khớp với nhau.
MERGE INTO
books
USING
authors
ON
books.author_id = authors.id
WHEN MATCHED THEN
UPDATE SET
books.primary_author = authors.name
WHEN NOT MATCHED THEN
INSERT
(books.author_id, books.primary_author)
VALUES
(authors.id, authors.name)
Truy vấn đầy đủ khi sử dụng MERGE
chắc chắn phức tạp hơn một chút so với INNER JOIN
cơ bản , nhưng khi bạn nắm được cách thức hoạt động, bạn sẽ nhanh chóng hiểu khả năng này có thể thực sự mạnh mẽ như thế nào.
Vài dòng đầu tiên khá dễ hiểu:
MERGE INTO
books
USING
authors
ON
books.author_id = authors.id
Chúng tôi muốn MERGE INTO
(UPDATING
/ INSERT
) các books
bảng bằng cách sử dụng authors
phụ và chúng tôi đang đối sánh hai bảng dựa trên cùng một books.author_id = authors.id
so sánh.
Nơi MERGE
lệnh khác là ở logic phân nhánh theo sau.
WHEN MATCHED THEN
UPDATE SET
books.primary_author = authors.name
Ở đây, chúng tôi yêu cầu SQL chỉ thực hiện một hành động khi các bản ghi MATCHED
- khi một bản ghi hiện có được tìm thấy. Trong trường hợp đó, chúng tôi thực hiện một UPDATE
tiêu chuẩn giống như chúng tôi đã làm trước đây, đặt books.primary_author
trường bằng với authors.name
trường.
Cuối cùng, nếu truy vấn phát hiện ra một bản ghi so sánh phù hợp không tồn tại, thay vào đó chúng tôi thực hiện INSERT
.
WHEN NOT MATCHED THEN
INSERT
(books.author_id, books.primary_author)
VALUES
(authors.id, authors.name)
Ở đây, chúng tôi chỉ yêu cầu SQL để INSERT
một bản ghi mới vào books
bảng và chuyển các giá trị cho author_id
và primary_author
các trường, được lấy từ các authors
được liên kết bảng ghi.
Kết quả cuối cùng của MERGE
của chúng tôi tuyên bố đó là cho mọi tác giả trong authors
bảng, chúng tôi xác minh xem một cuốn sách tương ứng có tồn tại trong books
hay không . Nếu một bản ghi được tìm thấy, chúng tôi đảm bảo books.primary_author
được đặt bằng UPDATE
và không tìm thấy kết quả phù hợp nào, chúng tôi thêm một bản ghi mới vào books
.
Cùng với đó, bạn nên hiểu rõ về hai phương pháp khác nhau có thể được sử dụng để UPDATING
bản ghi trong SQL bằng cách sử dụng SELECT
phụ, so sánh tuyên bố.