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

Cập nhật bằng cách sử dụng Tham gia - Đa DB / Bảng

Tôi giả sử khi bạn đặt lại câu hỏi, bạn muốn cú pháp sẽ hoạt động trên cả Oracle và SQL Server mặc dù chắc chắn nó sẽ chỉ ảnh hưởng đến một bảng.

Mức đầu vào Mã chuẩn SQL-92 được hỗ trợ bởi cả hai nền tảng, do đó, mã SQL-92 'truy vấn con vô hướng' sau đây sẽ hoạt động:

UPDATE table1 
   SET my_value = (
                   SELECT t2.tab1_id
                     FROM table2 AS t2 
                    WHERE t2.tab1_id = table1.id
                  )       
 WHERE id = 1234
       AND EXISTS (
                   SELECT * 
                     FROM table2 AS t2 
                    WHERE t2.tab1_id = table1.id
                  );

Lưu ý rằng trong khi sử dụng tên tương quan t1 cho Ttble1 là cú pháp hợp lệ theo Tiêu chuẩn SQL-92, điều này sẽ hiện thực hóa một bảng và UPDATE sau đó sẽ nhắm mục tiêu bảng cụ thể hóa 't1' và để bảng cơ sở của bạn 'table1` không bị ảnh hưởng, mà tôi cho rằng không bị ảnh hưởng mong muốn. Mặc dù tôi khá chắc chắn rằng cả Oracle và SQL Server đều không tuân thủ về vấn đề này và trong thực tế sẽ hoạt động như mong đợi, nhưng không có hại gì khi cực kỳ thận trọng và tuân theo cú pháp SQL-92 bằng cách hoàn toàn đủ điều kiện cho bảng mục tiêu.

Dân gian có xu hướng không thích mã 'lặp lại' trong các truy vấn phụ ở trên (mặc dù trình tối ưu hóa phải đủ thông minh để đánh giá nó chỉ một lần).

Các phiên bản mới hơn của Oracle và SQL Server đều hỗ trợ SQL Chuẩn:2003 MERGE cú pháp, có thể có thể sử dụng một cái gì đó gần với điều này:

MERGE INTO table1 
   USING (
          SELECT t2.tab1_id
            FROM table2 AS t2
         ) AS source
      ON id = source.tab1_id
         AND id = 1234
WHEN MATCHED THEN
   UPDATE
      SET my_value = source.tab1_id;

Tôi chỉ nhận thấy rằng ví dụ của bạn thậm chí còn đơn giản hơn tôi nghĩ lúc đầu và chỉ yêu cầu một truy vấn con đơn giản sẽ chạy trên hầu hết các sản phẩm SQL, ví dụ:

UPDATE table1
   SET my_value = 'foo'
 WHERE EXISTS (
               SELECT * 
                 FROM table2 AS t2 
                WHERE t2.tab1_id = table1.id
              );


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Một cách để kiểm tra Oracle đã hoàn thành sql

  2. Liệt kê đệ quy các đồng thời của chế độ xem DBA_DEPENDENCIES của Oracle

  3. Cách sử dụng Giải mã trong Oracle

  4. Làm cách nào để di chuyển tệp zip sang cột blob trong Java?

  5. ORA-01830 khi chuyển số thành từ