Cập nhật hoặc Chèn (nhiều hàng và cột) từ truy vấn con trong PostgreSQL


106

Tôi đang cố gắng làm điều gì đó như thế này trong postgres:

  • UPDATE table1 SET (col1, col2) = (SELECT col2, col3 FROM othertable WHERE othertable.col1 = 123);

  • INSERT INTO table1 (col1, col2) VALUES (SELECT col1, col2 FROM othertable)

Nhưng điểm 1 không thể thực hiện được ngay cả với postgres 9.0 như đã đề cập trong tài liệu ( http://www.postgresql.org/docs/9.0/static/sql-update.html )

Ngoài ra điểm 2 dường như không hoạt động. tôi đang gặp lỗi sau: truy vấn con chỉ được trả về một cột.

Hy vọng ai đó có một giải pháp cho tôi. nếu không các truy vấn sẽ mất một khoảng thời gian :(.

FYI: Tôi đang cố gắng chọn các cột khác nhau từ một số bảng và lưu trữ chúng vào một bảng tạm thời để ứng dụng khác có thể dễ dàng tìm nạp dữ liệu đã chuẩn bị.

Câu trả lời:


175

Đối với CẬP NHẬT

Sử dụng:

UPDATE table1 
   SET col1 = othertable.col2,
       col2 = othertable.col3 
  FROM othertable 
 WHERE othertable.col1 = 123;

Đối với CHÈN

Sử dụng:

INSERT INTO table1 (col1, col2) 
SELECT col1, col2 
  FROM othertable

Bạn không cần VALUEScú pháp nếu bạn đang sử dụng CHỌN để điền các giá trị CHÈN.


1
Có thể kết hợp Cập nhật & Chèn để nếu một cái không thành công, cái kia sẽ được sử dụng mà không bị lỗi (độc lập cho mỗi hàng). Tôi nghĩ rằng đó sẽ là một giải pháp hoàn chỉnh hơn cho câu hỏi (ví dụ: stackoverflow.com/a/6527838/781695 )
sử dụng

26

Câu trả lời của OMG Ponies hoạt động hoàn hảo, nhưng chỉ trong trường hợp bạn cần thứ gì đó phức tạp hơn, đây là ví dụ về truy vấn cập nhật nâng cao hơn một chút:

UPDATE table1 
SET col1 = subquery.col2,
    col2 = subquery.col3 
FROM (
    SELECT t2.foo as col1, t3.bar as col2, t3.foobar as col3 
    FROM table2 t2 INNER JOIN table3 t3 ON t2.id = t3.t2_id
    WHERE t2.created_at > '2016-01-01'
) AS subquery
WHERE table1.id = subquery.col1;

1
Bạn là người tốt nhất :) :)
Ashwini

1
hoàn hảo. điều này hoạt động tốt nhất trong đó bạn cần chọn một tập hợp con dựa trên một điều kiện liên quan đến chính bảng được cập nhật.
mythicalcoder

@David Namenyi bạn có thể giải thích truy vấn này không?
Chintan Pathak

15
UPDATE table1 SET (col1, col2) = (col2, col3) FROM othertable WHERE othertable.col1 = 123;
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.