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

Sử dụng câu lệnh WITH và UPDATE trong cùng một truy vấn SQL

Bạn có thể sử dụng mệnh đề with trong một bản cập nhật; bạn chỉ cần làm điều đó ở đúng nơi:

UPDATE mytable
   SET name = (WITH temp AS((SELECT 'abcd' AS oldvalue, 'defg' AS newvalue FROM dual) UNION
                            (SELECT .....) --About 300 lines of this, copied from Excel and then formatted into the SELECT statement
                           )
               SELECT newvalue
               FROM   temp
               WHERE  mytable.name = temp.oldvalue);

Tuy nhiên, có thể bạn chỉ muốn cập nhật các hàng tồn tại trong truy vấn con tạm thời, vì vậy bạn sẽ cần thêm mệnh đề where:

UPDATE mytable
   SET name = (WITH temp AS((SELECT 'abcd' AS oldvalue, 'defg' AS newvalue FROM dual) UNION
                            (SELECT .....) --About 300 lines of this, copied from Excel and then formatted into the SELECT statement
                           )
               SELECT newvalue
               FROM   temp
               WHERE  mytable.name = temp.oldvalue)
WHERE  EXISTS (WITH temp AS((SELECT 'abcd' AS oldvalue, 'defg' AS newvalue FROM dual) UNION
                            (SELECT .....) --About 300 lines of this, copied from Excel and then formatted into the SELECT statement
                           )
               SELECT NULL
               FROM   temp
               WHERE  mytable.name = temp.oldvalue);

Ngoài ra, hãy sử dụng câu lệnh MERGE:

merge into mytable tgt
  using (WITH temp AS((SELECT 'abcd' AS oldvalue, 'defg' AS newvalue FROM dual) UNION
                      (SELECT .....) --About 300 lines of this, copied from Excel and then formatted into the SELECT statement
                     )
         SELECT mytable.rowid r_id,
                temp.newvalue
         FROM   temp
         inner  join mytable on mytable.name = temp.oldvalue) src
    on (tgt.rowid = src.r_id)
when matched then
update set tgt.name = src.newvalue;

N.B. bạn phải tham gia vào bảng thực tế trong truy vấn nguồn của câu lệnh hợp nhất vì bạn đang cố cập nhật cột đang được kết hợp, điều mà bạn không thể thực hiện trong một câu lệnh hợp nhất - do đó tôi đã chuyển phép kết hợp thành tham gia trên mytable.rowid.

Bạn sẽ phải kiểm tra cả hai câu lệnh để xem câu lệnh nào hoạt động tốt nhất trên dữ liệu của bạn.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ORA-01749:bạn không thể CẤP / THU HỒI đặc quyền cho / từ chính mình

  2. Các giá trị được phân tách bằng dấu phẩy cho hàm IN trong oracle

  3. Đảo ngược một chuỗi bằng cách sử dụng một chỉ mục trong Oracle

  4. Chia các giá trị được phân tách bằng dấu phẩy thành các cột trong Oracle

  5. Làm thế nào để hợp nhất một nhóm bản ghi trong oracle?