Cách cập nhật bảng từ bảng khác


28

Tôi có một bảng A có cột (id, trường_1, trường_2) và một bảng B khác có cột (id, trường_2)

Bây giờ tôi muốn hợp nhất bảng B thành A, điều đó có nghĩa là tôi muốn cập nhật trường_2 trong bảng A thành giá trị của bảng B. Vậy làm thế nào để thực hiện điều đó? BTW Tôi đang sử dụng orory

Cảm ơn


Cả hai bảng có chứa cùng một số lượng hồ sơ?
ujjwalesri

Câu trả lời:


29

Một cách tiếp cận khác cho truy vấn phụ liên quan (được đề xuất bởi Kerri) sẽ là sử dụng câu lệnh MERGE, thể hiệu quả hơn so với câu hỏi phụ (chỉ có thể được xác minh bằng cách xem xét kế hoạch thực hiện của cả hai câu lệnh).

MERGE INTO table_b 
USING 
(
  SELECT id,
         field_2
  FROM table_a
) ta ON (ta.id = table_b.id)
WHEN MATCHED THEN UPDATE 
    SET table_b.field_2 = ta.field_2

2
Hạn chế duy nhất cho MERGEcâu lệnh là bạn không thể cập nhật cột mà nó được nối, tức là bạn không thể cập nhật cột được sử dụng trong ONmệnh đề.
Lalit Kumar B

Điều này hiệu quả với tôi, đã cập nhật 2,5 triệu hàng so với thử phương thức truy vấn phụ chạy trong khoảng 45 phút trước khi xảy ra lỗiORA-01555: snapshot too old
helmy

15

Không chắc chắn chính xác những gì bạn đang theo đuổi cái này, nhưng cái này sẽ hoạt động một lần hoặc liên tục thông qua một công việc được lên lịch:

UPDATE table_a a
   SET field_2 = ( SELECT field_2
                     FROM table_b b
                    WHERE b.id = a.id )
;

Bây giờ, mỗi lần thực hiện ở trên, nó sẽ thực hiện trên tất cả các hàng trong bảng. Nếu đây là việc bạn cần làm mọi lúc, tôi sẽ đề xuất một cái gì đó khác, nhưng đối với một bàn một lần hoặc rất nhỏ thì nó là đủ.


2

Tôi đã thực hiện thành công việc này bằng cách sử dụng một bảng trong user1 từ một bảng khác trong user2:

update user1.table1 a
set a.field1 = (
  select b.field1
  from user2.table2 b
  where a.field1=b.field1
)
where <condition for update user1.table1>

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.