Cập nhật cột với dữ liệu từ một bảng khác


11

Tôi đang làm việc về vấn đề phức tạp, nhưng tôi sẽ đơn giản hóa nó cho vấn đề này.

Tôi có hai bàn

A [ID, column1, column2, column3]
B [ID, column1, column2, column3, column4]

và tôi muốn cập nhật phần ba:

C [ID, column1, column2,column3] 

Tôi đang cập nhật một bảng thứ ba khác bằng cách sử dụng truy vấn này.

UPDATE C 
  set column1=t.firstTab, column2=t.secondTab, column3=t.thirdTab 
  from (select A.column1 as firstTab, B.column2 as secTab, 
              (A.column1 + B.column2) thirdTab 
        from A, B limit 1; ) as t ; 

Tôi đã nhận:

UPDATE 0

Khi tôi chạy truy vấn này:

select A.column1 as firstTab, B.column2 as secTab, (A.column1 + B.column2) thirdTab 
            from A, B limit 1; 

Tôi đã có kết quả. Tui bỏ lỡ điều gì vậy ?

Dữ liệu mẫu: http://sqlfiddle.com/#!15/e4d08/5

Câu trả lời:


19

Hình thức phù hợp sẽ là (giả sử phiên bản pg hiện tại 9.3 vì thiếu thông tin):

UPDATE C 
SET    column1 = A.column1 
     , column2 = B.column2 
     , column3 = A.column1 + B.column2
FROM   A
JOIN   B ON A.id = B.id  -- ??? not specified in question!
WHERE  C.id = A.id      --  ??? not specified in question!
AND   (C.column1, C.column2, C.column3) IS DISTINCT FROM
      (A.column1, B.column2, A.column1 + B.column2);

WHEREMệnh đề cuối cùng là tùy chọn để tránh các bản cập nhật trống sẽ không thay đổi bất cứ điều gì (nhưng vẫn viết một phiên bản hàng mới với chi phí đầy đủ).

ypercube đã đưa ra một lời giải thích cơ bản trong bình luận của mình:

Bạn không nhận được sự trùng lặp. Bảng dẫn xuất của bạn là nối chéo AB(nghĩa là không có bất kỳ điều kiện nối nào ) và sau đó chọn một hàng tùy ý ( LIMIT 1không có ORDER BY). Sau đó, nó sử dụng các giá trị từ hàng tùy ý đó để cập nhật tất cả các hàng của bảng C. Nếu bạn muốn các giá trị khác nhau được sử dụng cho các hàng C khác nhau, bạn sẽ phải tham gia 3 bảng (sử dụng JOIN - ONWHERE)

Tham khảo hướng dẫn trên UPDATEđể biết chi tiết.


0

bạn phải làm một cái gì đó như thế này:

UPDATE C 
  set column1=t.firstTab, column2=t.secondTab, column3=t.thirdTab 
  from (select A.column1 as firstTab, B.column2 as secTab, 
              (A.column1 + B.column2) thirdTab 
        from A
        join B  on ...
        where ... ) as t
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.