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

Câu lệnh cập nhật Oracle với chức năng nhóm

Bạn có hai bản ghi trong mỗi bảng trong đó area01 và bạn cần đặt chúng thành các giá trị khác nhau để đáp ứng khóa chính - bạn không thể đặt cả hai thành giá trị tối đa hoặc tối thiểu từ bảng thứ hai, vì vậy bạn không thực sự muốn thực hiện bất kỳ nhóm nào.

Dường như không có bất kỳ thứ tự nào khác giữa các bản ghi có cùng area , vì vậy tôi sẽ cho rằng đó là tùy ý và không quan trọng bản ghi nào cho mỗi vùng area lấy branch_code nào từ bảng khác. Nếu nó không phải là tùy ý thì các quy tắc sẽ cần phải được chỉ định ...

Một bản cập nhật tương quan rất khó nếu bạn cần khớp theo một thứ tự tùy ý trong một nhóm bản ghi. Bạn cần một số cách để xác định thứ tự hàng, nhưng thêm row_number() vào các bảng ban đầu để tạo chế độ xem nội tuyến sẽ dẫn đến lỗi ORA-01732.

Tuy nhiên, bạn có thể sử dụng rowid của bảng đích cột giả; bạn chỉ cần thực hiện một phép nối bổ sung trong mối tương quan để nhận được cùng một giá trị đó cùng với branch_code mới . Một cái gì đó như:

select bc.rid,
  bc.area,
  bc.branch_code,
  bc.branch_name,
  bc2.area,
  bc2.branch_code,
  bc2.branch_name
from (
  select bc.*,
    bc.rowid as rid,
    row_number() over (partition by bc.area order by bc.branch_code) as rn
  from branch_cp bc
) bc
join (
  select bc2.*,
    row_number() over (partition by bc2.area order by bc2.branch_code) as rn
  from branch_cp_2 bc2
) bc2
on bc2.area = bc.area
and bc2.rn = bc.rn;

Điều này mang lại cho bạn:

RID                AREA  BRANCH_CODE BRANCH_NAME AREA  BRANCH_CODE BRANCH_NAME
------------------ ----- ----------- ----------- ----- ----------- -----------
AAAwy+AAEAAAA0DAAA 01    01          A           01    04          D           
AAAwy+AAEAAAA0DAAB 01    02          B           01    05          E           
AAAwy+AAEAAAA0DAAC 03    03          C           03    06          F           

Bây giờ bạn không thực sự cần tất cả các cột đó, bạn chỉ cần rid (branch_cp.rowid ) và branch_cp_2.branch_code tương quan .

Nhưng bạn cũng chỉ muốn cập nhật khi có kết quả phù hợp - để vô hiệu hóa bất kỳ hàng nào không có giá trị trong bảng khác - vì vậy bạn sẽ phải lặp lại phép nối đó trong exists truy vấn con.

Đơn giản hơn để thực hiện merge :

merge into branch_cp bc
using (
  select bc.rid,
      bc2.branch_code
    from (
      select bc.*,
        bc.rowid as rid,
        row_number() over (partition by bc.area order by bc.branch_code) as rn
      from branch_cp bc
    ) bc
    join (
      select bc2.*,
        row_number() over (partition by bc2.area order by bc2.branch_code) as rn
      from branch_cp_2 bc2
    ) bc2
    on bc2.area = bc.area
    and bc2.rn = bc.rn
) bc2
on (bc.rowid = bc2.rid)
when matched then update set bc.branch_code = bc2.branch_code;

3 rows merged.

Bảng của bạn hiện có:

select * from branch_cp;

AREA  BRANCH_CODE BRANCH_NAME
----- ----------- -----------
01    04          A           
01    05          B           
03    06          C           

SQL Fiddle .




  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 theo dõi bảng / chế độ xem / v.v. nào phụ thuộc vào bảng, trong Oracle

  2. Số lượt chọn (1) từ tên_bảng trên bất kỳ bảng cơ sở dữ liệu nào có nghĩa là gì?

  3. JBoss tự động kết nối lại với cơ sở dữ liệu khi cơ sở dữ liệu được khởi động lại / ngắt kết nối

  4. Lỗi ORA-01804 khi cố gắng tải Oracle dbDriver

  5. Trích xuất phần thời gian từ cột TimeStamp trong ORACLE