2010-06-09 30 views
43

Tôi cố gắng để viết các truy vấn sau đây trên postgresql:Làm thế nào để thực hiện truy vấn con Postgresql trong mệnh đề chọn với tham gia vào từ mệnh đề như SQL Server?

select name, author_id, count(1), 
    (select count(1) 
    from names as n2 
    where n2.id = n1.id 
     and t2.author_id = t1.author_id 
    )    
from names as n1 
group by name, author_id 

Điều này chắc chắn sẽ làm việc trên Microsoft SQL Server nhưng nó không phải ở tất cả trên postegresql. Tôi đọc tài liệu hướng dẫn của nó một chút và có vẻ như tôi có thể viết lại nó như:

select name, author_id, count(1), total      
from names as n1, (select count(1) as total 
    from names as n2 
    where n2.id = n1.id 
     and n2.author_id = t1.author_id 
    ) as total 
group by name, author_id 

Nhưng đó trả về lỗi sau trên postegresql: "subquery trong FROM không thể đề cập đến mối quan hệ khác của cấp truy vấn tương tự". Vì vậy, tôi bị mắc kẹt. Có ai biết làm thế nào tôi có thể đạt được điều đó?

Cảm ơn

+0

Trên thực tế nó có vẻ như điều này sẽ làm việc trên Postgres (có thể 6 năm trước đây nó đã không :)) – qwertzguy

Trả lời

69

Tôi không chắc là tôi hiểu ý định của bạn một cách hoàn hảo, nhưng có lẽ sau đây sẽ được gần gũi với những gì bạn muốn:

select n1.name, n1.author_id, count_1, total_count 
    from (select id, name, author_id, count(1) as count_1 
      from names 
      group by id, name, author_id) n1 
inner join (select id, author_id, count(1) as total_count 
       from names 
       group by id, author_id) n2 
    on (n2.id = n1.id and n2.author_id = n1.author_id) 

Thật không may này cho biết thêm các yêu cầu của nhóm subquery đầu tiên bởi id cũng như tên và author_id, mà tôi không nghĩ là muốn. Tôi không chắc chắn làm thế nào để làm việc xung quanh đó, tuy nhiên, vì bạn cần phải có id có sẵn để tham gia vào các subquery thứ hai. Có lẽ ai đó sẽ đưa ra một giải pháp tốt hơn.

Chia sẻ và thưởng thức.

+0

Bob hoàn hảo, mà thực sự làm việc. Cảm ơn rất nhiều! Tôi đã phải thực hiện một thay đổi nhỏ vì tôi không cần tham gia với id, chỉ là author_id. Vì vậy, các truy vấn cuối cùng là: chọn n1.name, n1.author_id, đếm_1, TOTAL_COUNT từ (chọn id, tên, AUTHOR_ID, đếm (1) như đếm_1 từ tên nhóm bởi id, tên, AUTHOR_ID) n1 bên tham gia (chọn AUTHOR_ID, đếm (1) như TOTAL_COUNT từ tên nhóm bởi AUTHOR_ID) n2 trên (n2.author_id = n1.author_id) Bây giờ tôi có điều này, những gì tôi thực sự muốn là chia đếm_1 bởi TOTAL_COUNT để có tần số chuẩn hóa. = D –

+0

ops, chỉ cần nhận ra sql không được định dạng đúng ở đây. :( Sẽ trả lời để bổ sung –

+0

Tôi không gặp vấn đề gì Ricado đang nói 'bout nhưng SQL này hoàn toàn khắc phục được vấn đề của tôi ...: D THANK YOU !!! – tftd

7

Tôi chỉ trả lời ở đây với phiên bản được định dạng của sql thức tôi cần dựa trên Bob Jarvis câu trả lời như được đăng trong nhận xét của tôi trên:

select n1.name, n1.author_id, cast(count_1 as numeric)/total_count 
    from (select id, name, author_id, count(1) as count_1 
      from names 
      group by id, name, author_id) n1 
inner join (select author_id, count(1) as total_count 
       from names 
       group by author_id) n2 
    on (n2.author_id = n1.author_id) 
Các vấn đề liên quan