2012-10-22 27 views
16

Tôi có một bảng gọi là map_tags:PostgreSQL: Sub-chọn bên chèn

map_id | map_license | map_desc 

Và bảng khác (widgets) mà hồ sơ có chứa một tài liệu tham khảo chính nước ngoài (1-1) lên mức kỷ lục map_tags:

widget_id | map_id | widget_name 

Với ràng buộc rằng tất cả map_license s là duy nhất (tuy nhiên không được thiết lập làm khóa trên map_tags), thì nếu tôi có map_licensewidget_name, tôi muốn thực hiện chèn trên widgets tất cả các bên trong câu lệnh SQL giống nhau:

INSERT INTO 
    widgets w 
(
    map_id, 
    widget_name 
) 
VALUES (
    (
     SELECT 
      mt.map_id 
     FROM 
      map_tags mt 
     WHERE 
      // This should work and return a single record because map_license is unique 
      mt.map_license = '12345' 
    ), 
    'Bupo' 
) 

tôi tin tôi đi đúng hướng nhưng biết ngay lập tức rằng đây là SQL sai cho Postgres. Có ai biết cách thích hợp để đạt được một truy vấn như vậy?

+1

Chưa bao giờ thực hiện nó với PostgreSQL, nhưng không nên cho nó trông như 'INSERT INTO widget CHỌN NULL, map_id, 'Bupo' TỪ map_tags ĐÂU map_license = '12345''? – raina77ow

+0

Cảm ơn @ raina77ow (+1) - Tôi không chắc đó có phải là điều bạn nên làm hay không. Câu lệnh 'SELECT' thay cho cú pháp' (...) VALUES (...) 'chắc chắn đã ném tôi đi. Bạn có thể giải thích cho tôi như thế nào nên làm việc? Cảm ơn một lần nữa! –

+0

Vâng, tôi chỉ sử dụng nó như [this] (http://dev.mysql.com/doc/refman/5.1/en/insert-select.html) trong MySQL ... Lý do, tôi cho rằng, là bạn phải xây dựng toàn bộ tập hợp dữ liệu sẽ được chèn vào - và giá trị ((SELECT smth), 'smth_else') không thực hiện.) – raina77ow

Trả lời

18
INSERT INTO widgets 
(
    map_id, 
    widget_name 
) 
SELECT 
    mt.map_id, 'Bupo' 
FROM 
    map_tags mt 
WHERE 
    mt.map_license = '12345' 
+0

Đây là cú pháp cực kỳ hữu ích khi bảng bạn muốn chèn vào có PK SERIAL hoặc tương tự – dougajmcdonald

26

Sử dụng biến thể INSERT INTO SELECT, bao gồm bất kỳ hằng số nào nằm ngay trong tuyên bố SELECT.

Các PostgreSQL INSERT Cú pháp là:

INSERT INTO table [ (column [, ...]) ] 
{ DEFAULT VALUES | VALUES ({ expression | DEFAULT } [, ...]) [, ...] | query } 
[ RETURNING * | output_expression [ [ AS ] output_name ] [, ...] ] 

Hãy chú ý của truy vấn tùy chọn ở cuối dòng thứ hai ở trên.

Đây là một ví dụ cho bạn.

INSERT INTO 
    widgets 
    (
     map_id, 
     widget_name 
    ) 
SELECT 
    mt.map_id, 
    'Bupo' 
FROM 
    map_tags mt 
WHERE 
    mt.map_license = '12345' 
+1

Tại sao câu trả lời khác gần như giống hệt nhau nhưng ít hoàn thành và một phút sau đó lại được bình chọn nhiều hơn và được chấp nhận? –

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