2010-10-02 55 views

Trả lời

109

Chừng nào bạn có chỉ số phù hợp ở nơi này nên làm việc ổn:

UPDATE table_a 
SET 
     column_a_1 = (SELECT table_b.column_b_1 
          FROM table_b 
          WHERE table_b.user_name = table_a.user_name) 
    , column_a_2 = (SELECT table_b.column_b_2 
          FROM table_b 
          WHERE table_b.user_name = table_a.user_name) 
WHERE 
    EXISTS (
     SELECT * 
     FROM table_b 
     WHERE table_b.user_name = table_a.user_name 
    ) 

UPDATE trong sqlite3 không hỗ trợ một mệnh đề FROM, mà làm này làm việc nhiều hơn một chút so với trong RDBMS khác.

Nếu hiệu suất không thỏa đáng, một tùy chọn khác có thể là tạo các hàng mới cho table_a bằng cách chọn và tham gia với table_a vào bảng tạm thời. Sau đó xóa dữ liệu từ table_a và repopulate từ tạm thời.

+4

tôi đã loại trừ phần table_a từ ha còn lại bên thứ hai của đối số đã đặt, để làm việc này. Sử dụng câu trả lời ở trên, có vẻ như 'column_a_1 = (SELECT table_b.column_b_1 FROM table_b WHERE table_b.user_name = table_a.user_name)' –

+0

Câu trả lời này giúp hiểu chi tiết hơn cách sao chép cho câu trả lời được đăng tại http://stackoverflow.com/question/17267417/how-to-upsert-merge-insert-on-duplicate-update-in-postgresql/17267423 # 17267423 – zerocog

+0

Số lần tham gia được thực hiện ở đây? chỉ 3 lần, hoặc thay vì 3 lần mỗi hàng trong table_a? (SQL của tôi là gỉ) –

2

Có một giải pháp tốt hơn nhiều để cập nhật một bảng từ bảng khác:

;WITH a AS 
(
    SELECT 
     song_id, 
     artist_id 
    FROM 
     online_performance 
) 
UPDATE record_performance 
SET 
    op_song_id=(SELECT song_id FROM a), 
    op_artist_id=(SELECT artist_id FROM a) 

; 
+1

Vì ở trên là tìm kiếm các hàng cụ thể (record_id = 2347), người ta sẽ phải viết mã trên 1000 lần để cập nhật 1000 hàng? –

+0

Điều này có vẻ đầy hứa hẹn, nhưng nó sẽ không hoạt động khi bạn cần tham gia cả hai bảng trên một cột chung (chẳng hạn như 'user_name' trong câu hỏi gốc). Thay vào đó, điều này sẽ thiết lập tất cả các giá trị tương ứng trong bảng đang được cập nhật cho những giá trị của chỉ một bản ghi trong bảng nguồn. Đã cố gắng liệt kê cột chung và thêm điều kiện 'WHERE', nhưng nó không hoạt động. –

+0

** CẬP NHẬT ** Thực ra, nỗ lực của tôi là chính xác. Tôi có thể đã có thêm một dòng trong truy vấn và nó nói * không có lỗi * vì lý do nào đó, điều đó làm tôi bối rối. Giải pháp thực sự là thêm cột được yêu cầu vào lựa chọn đầu tiên và sau đó thực hiện tất cả các lựa chọn khác đề cập đến nó, ví dụ: '(SELECT song_id TỪ một WHERE guid = record_performance.guid)' –

1

Bắt đầu từ phiên bản sqlite 3,15 cú pháp cho UPDATE thừa nhận một cột tên-list ở phần SET nên truy vấn có thể được viết như

UPDATE table_a 
SET 
    (column_a_1, column_a_2) = (SELECT table_b.column_b_1, table_b.column_b_2 
           FROM table_b 
           WHERE table_b.user_name = table_a.user_name) 
WHERE 
    EXISTS (
     SELECT * 
     FROM table_b 
     WHERE table_b.user_name = table_a.user_name 
    ) 

đó là không chỉ ngắn mà còn nhanh hơn

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