Bạn có hai bản ghi trong mỗi bảng trong đó area
là 01
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