2014-06-26 23 views
7

Tôi có bảng gọi temp_table trong đó bao gồm các dòng sau đây:Nội tham gia trong báo cáo cập nhật trong PostgreSQL

cola colb result 
---------------- 
    p4 s1 0 
    p8 s1 0 
    p9 s1 0 
    p5 f1 0 
    p8 f1 0 

Bây giờ tôi cần phải cập nhật cột kết quả với count (*) của colb. Mà tôi đang cố gắng truy vấn sau đây:

update tem_table 
set result = x.result 
from tem_table tt 
inner join(select colb,count(*) as result from tem_table group by colb) x 
on x.colb = tt.colb; 

Và chọn colb khác biệt và là kết quả của temp_table:

select distinct colb,result from tem_table; 

Bắt đầu ra:

colb result 
----------- 
s1 3 
f1 3 

Nhưng sản lượng dự kiến ​​là:

colb result 
----------- 
s1 3 
f1 2 

Tôi là n ot nhận được nơi tôi nhận được sai trong truy vấn của tôi? Xin hãy giúp tôi.Thanks

Trả lời

24

Bạn không nên lặp lại bảng được cập nhật trong mệnh đề from. Điều này sẽ tạo ra một tự tham gia Descartes.

Trích dẫn từ hướng dẫn:

Lưu ý rằng các bảng mục tiêu không phải xuất hiện trong from_list, trừ khi bạn có ý định tự tham gia (trong trường hợp này nó phải xuất hiện với một bí danh trong from_list)

(tôi nhấn mạnh)

Thật không may UPDATE không hỗ trợ tham gia rõ ràng bằng cách sử dụng từ khóa JOIN. Một cái gì đó như thế này sẽ hoạt động:

update tem_table 
    set result = x.result 
from (
    select colb,count(*) as result 
    from tem_table 
    group by colb 
) x 
where x.colb = tem_table.colb; 
+0

Tuyệt vời! Cảm ơn bạn rất nhiều. – Meem

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