2011-07-26 42 views
7

Tôi biết không có câu lệnh Update-Join trong PL/SQL. Tôi đã từng viết T-SQL.Cập nhật PL/SQL Tham gia?

Tôi có hai bảng.

Alex_Table1 
--------------------------- 
PK   VAL 
--------------------------- 
1   Value1 
2   Value2 
3   Value3 


Alex_Table2 
--------------------------- 
PK   VAL 
--------------------------- 
1   Value1_2 
3   Value3_2 

Tôi muốn cập nhật VAL từ Alex_Table2 thành Alex_Table1 tham gia bằng cột PK.

Trong T-SQL, đó là đơn giản

update t1 set t1.VAL = t2.VAL 
from 
    Alex_Table1 t1 
    inner join Alex_Table2 t2 on t1.PK = t2.PK; 

Và kết quả là những gì tôi mong đợi

Alex_Table1 
--------------------------- 
PK   VAL 
--------------------------- 
1   Value1_2 
2   Value2 
3   Value3_2 

Câu hỏi của tôi là làm thế nào để làm trong PL/SQL? Cảm ơn!

Cập nhật

Cảm ơn Cybernate và ypercube đã cho tôi hai giải pháp hữu ích. Cả hai đều làm việc. Tuy nhiên, tôi muốn cho bạn biết hiệu suất giữa hai phát biểu này.

Bảng thực tế của tôi chứa 80.000 bản ghi và chỉ cần 3.000 cập nhật.

MERGE tuyên bố mất 0,533 giây.

UPDATE EXISTS tuyên bố mất hơn 3 phút (tôi không đo thời gian thực tế. Tôi chấm dứt quá trình của tôi sau 3 phút.)

Trả lời

13

Sử dụng một lệnh MERGE:

MERGE INTO Alex_Table1 t1 
USING Alex_Table2 t2 
ON (t1.PK = t2.PK) 
WHEN MATCHED THEN 
UPDATE SET t1.VAL = t2.VAL 
+0

WOW! <- đây là biểu hiện duy nhất của tôi! Cảm ơn! Điều này rất đơn giản và trực tiếp! Cảm ơn! –

+0

Tôi có một câu hỏi khác. Trong trường hợp hiện tại của tôi, câu lệnh cập nhật chỉ liên quan đến hai bảng. Tôi có thể sử dụng câu lệnh MERGE nếu câu lệnh cập nhật liên quan đến nhiều hơn hai bảng không? –

+0

Bạn có thể truy vấn hợp lệ thay cho Alex_Table2 trong truy vấn ở trên. Kiểm tra liên kết này để biết thêm thông tin: http://psoug.org/reference/merge.html – Chandu

5
UPDATE Alex_Table1 t1 
SET t1.VAL = 
     (SELECT t2.VAL 
     FROM Alex_Table2 t2 
     WHERE t2.PK = t1.PK 
    ) 
WHERE EXISTS 
     (SELECT * 
      FROM Alex_Table2 t2 
      WHERE t2.PK = t1.PK 
     ) 

này cũng làm việc (miễn là (PK) là chìa khóa chính của Alex_Table2) :

UPDATE 
    (SELECT t1.VAL A, t2.VAL B 
    FROM Alex_Table1 t1 
     JOIN Alex_Table2 t2 
     ON t2.PK = t1.PK 
) 
SET A = B ; 

Tested tại dbfiddle.uk.

+0

@ Alex: Hãy nhìn vào cách thứ hai quá. Vì bạn đã quen thuộc với JOIN, nên khá dễ dàng để mở rộng bản cập nhật cho hơn 2 bảng. –

+0

Xin lỗi, câu lệnh thứ hai của bạn không hoạt động. Thông báo lỗi là 'Lỗi SQL: ORA-00904:" T2 "." VAL ": số nhận dạng không hợp lệ ' –

+0

@ Alex: Bạn có thể thử ngay bây giờ không? Tôi không có sẵn một máy Oracle để kiểm tra. –

Các vấn đề liên quan