Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Cách CẬP NHẬT từ CHỌN trong SQL Server

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.idbooks.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_idprimary_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ố.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. T-SQL trim   (và các ký tự không phải chữ và số khác)

  2. Có sự khác biệt về hiệu suất giữa CTE, Truy vấn phụ, Bảng tạm thời hoặc Biến bảng không?

  3. Bảng lịch sử SQL Server - điền thông qua SP hoặc Trigger?

  4. Thay đổi một cột:null thành không null

  5. Xóa tài khoản thư cơ sở dữ liệu (SSMS)