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

CẬP NHẬT về chế độ xem dường như bảo toàn khóa trong Oracle nâng ORA-01779

Tôi đã cố gắng "thuyết phục" Oracle thực hiện MERGE bằng cách giới thiệu cột trợ giúp trong target:

MERGE INTO (SELECT (SELECT t.account_no FROM dual) AS account_no_temp,
                    t.account_no, t.contract_id 
            FROM t) t
USING (
  SELECT u.account_no_old, u.account_no_new, v.contract_id
  FROM u, v
  WHERE v.tenant_id = u.tenant_id
) s
ON (t.account_no_temp = s.account_no_old AND t.contract_id = s.contract_id)
WHEN MATCHED THEN UPDATE SET t.account_no = s.account_no_new;

​​db <> fiddle demo

CHỈNH SỬA

Một biến thể của ý tưởng ở trên - truy vấn con được chuyển trực tiếp đến ON phần:

MERGE INTO (SELECT t.account_no, t.contract_id FROM t) t
USING (
      SELECT u.account_no_old, u.account_no_new, v.contract_id
      FROM u, v
      WHERE v.tenant_id = u.tenant_id
    ) s
ON ((SELECT t.account_no FROM dual) = s.account_no_old
     AND t.contract_id = s.contract_id)
WHEN MATCHED THEN UPDATE SET t.account_no = s.account_no_new;

db <> fiddle demo2

Bài viết liên quan: Không thể cập nhật các cột được tham chiếu trong Điều khoản BẬT

CHỈNH SỬA 2:

MERGE INTO (SELECT t.account_no, t.contract_id FROM t) t
USING (SELECT u.account_no_old, u.account_no_new, v.contract_id
       FROM u, v
       WHERE v.tenant_id = u.tenant_id) s
ON((t.account_no,t.contract_id,'x')=((s.account_no_old,s.contract_id,'x')) OR 1=2) 
WHEN MATCHED THEN UPDATE SET t.account_no = s.account_no_new;

db <> fiddle demo3



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. cách lưu trữ các giá trị BigInteger trong cơ sở dữ liệu oracle

  2. Tự động thực thi kích thước bảng cơ sở dữ liệu tối đa bằng cách loại bỏ các hàng cũ

  3. Chọn tối thiểu. ba giá trị của một bản ghi trong một bảng khác với một JOIN

  4. Oracle Nhìn về phía sau Tích cực

  5. Làm thế nào để tạo và sử dụng bảng tạm thời trong thủ tục lưu trữ oracle?