2010-06-09 10 views
43

मैं PostgreSQL पर निम्न क्वेरी लिखने के लिए कोशिश कर रहा हूँ:SQL सर्वर जैसे खंड से जुड़ने के साथ चुनिंदा खंड में Postgresql सबक्वायरी कैसे करें?

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 

यह निश्चित रूप Microsoft SQL सर्वर पर काम करेगा, लेकिन यह बिल्कुल नहीं postegresql पर करता है। मैं इसके प्रलेखन थोड़ा पढ़ सकते हैं और यह मैं के रूप में यह फिर से लिखने सकता है लगता है:

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 

लेकिन उस postegresql पर निम्नलिखित त्रुटि देता है: "में से एक ही क्वेरी स्तर के अन्य संबंधों का उल्लेख नहीं कर सकते सबक्वेरी"। तो मैं अटक गया हूँ। क्या कोई जानता है कि मैं इसे कैसे प्राप्त कर सकता हूं?

धन्यवाद

+0

वास्तव में यह इस तरह लगता है (हो सकता है 6 साल Postgres पर काम करना चाहिए पहले यह नहीं था :)) – qwertzguy

उत्तर

69

मुझे यकीन है कि मैं अपने इरादे पूरी तरह से समझते हैं, लेकिन शायद निम्नलिखित आप क्या चाहते हैं के करीब होगा नहीं कर रहा हूँ:

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) 

दुर्भाग्य से इस से पहले सबक्वेरी समूहीकरण की आवश्यकता को कहते हैं आईडी के साथ ही नाम और author_id, जो मुझे नहीं लगता था चाहता था। मुझे यकीन नहीं है कि इसके आसपास कैसे काम करना है, हालांकि, आपको दूसरी सबक्वायरी में शामिल होने के लिए आईडी उपलब्ध कराने की आवश्यकता है। शायद कोई और बेहतर समाधान के साथ आएगा।

साझा करें और आनंद लें।

+0

परफेक्ट बॉब, वास्तव में काम किया। आपका बहुत बहुत धन्यवाद! मुझे थोड़ा बदलाव करना पड़ा क्योंकि मुझे आईडी के साथ जुड़ने की ज़रूरत नहीं है, सिर्फ लेखक_आईडी। तो अंतिम क्वेरी है: चयन n1.name, n1.author_id, count_1, TOTAL_COUNT से (आईडी, नाम, author_id का चयन करें, गिनती (1) के नाम से count_1 रूप समूह आईडी, नाम, author_id द्वारा) n1 भीतरी में शामिल होने के (author_id का चयन करें, गिनती (1) के नाम से TOTAL_COUNT के रूप में समूह author_id द्वारा) TOTAL_COUNT द्वारा count_1 विभाजित करने के लिए n2 पर (n2.author_id = n1.author_id) अब मैं इस किया है, क्या मैं वास्तव में चाहते हैं एक सामान्य आवृत्ति है। = डी –

+0

ओप, बस एहसास हुआ कि एसक्यूएल ठीक से स्वरूपित नहीं होता है। :( पूरक के लिए उत्तर देगा। –

+0

मुझे समस्या नहीं थी Ricado बात कर रहा था लेकिन इस एसक्यूएल ने पूरी तरह से मेरी समस्याओं को ठीक किया ...: डी धन्यवाद !!! – tftd

7

मैं सिर्फ अंतिम एसक्यूएल मैं बॉब जार्विस उत्तर के आधार पर की जरूरत के स्वरूपित संस्करण के साथ यहाँ का उत्तर देते ऊपर मेरी टिप्पणी में तैनात के रूप में:

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) 
संबंधित मुद्दे