2012-08-06 17 views
6

मैं Excel का उपयोग किया है समान स्कीमा की एक बड़ी संख्या के साथ एक डेटाबेस से स्कीमा नामों की सूची से कई SELECT बयान उत्पन्न करने के लिए गठबंधन मेरे स्कीमा के उदाहरण, हकीकत में सैकड़ों हैं)।PostgreSQL कई चुनिंदा बयान

प्रत्येक SELECT केवल एक परिणाम लौटाएगा। मैं बस स्कीमा के रूप में कई पंक्तियों के साथ एक कॉलम result चाहता हूं। इसके बाद मैं स्कीमा नामों के खिलाफ Excel में इसे वापस कॉपी कर सकता हूं।

ऊपर मैं 1 पंक्ति मिलता है, दूसरों को खारिज कर दिया जा रहा है जब मैं क्वेरी चलाने:

 
Query result with 1 row discarded. 

Query result with 1 row discarded. 

Total query runtime: 40 ms. 
1 row retrieved. 

मैं UNION ALL उपयोग करने की कोशिश की है, लेकिन limit 1 मैं एक पंक्ति केवल एक स्कीमा से दिया जाता है सुनिश्चित करने के लिए उपयोग कर रहा हूँ टेबल काम करने से रोकने के लिए प्रतीत होता है।

मैं या तो अन्य पंक्तियों को त्यागने से कैसे रोक सकता हूं, या एक प्रश्न लिख सकता हूं जो मुझे आवश्यक मानों को वापस कर देगा (दो कॉलम - schema_name, परिणाम - प्रत्येक स्कीमा के लिए एक पंक्ति) एक अधिक कुशल तरीके से?

उत्तर

10

बस वाक्य रचना स्पष्ट बनाने के लिए कोष्ठक में अलग-अलग बयान लपेट एक ORDER BY बिना

select_statement किसी भी SELECT बयान है, LIMIT , FOR UPDATE, या FOR SHARE खंड। (ORDER BY और LIMIT एक उपसूचक को संलग्न किया जा सकता है अगर यह कोष्ठक में संलग्न है। कोष्ठकों के बिना, ये धाराएं UNION का परिणाम पर लागू होते हैं पर ले जाया जाएगा, न कि उसकी दाएँ हाथ के इनपुट अभिव्यक्ति के लिए।)

5

एक सबक्वायरी में लपेटना इसके चारों ओर मिल जाएगा, लेकिन यह थोड़ा बदसूरत हो जाता है।

SELECT result FROM (select 'a'::text AS result from foo limit 1) a 
UNION ALL 
SELECT result FROM (select 'b'::text AS result from bar limit 1) b 

अद्यतन

इरविन के देखें प्रतिक्रिया। यह बेहतर है।

(SELECT result FROM tbl1 LIMIT 1) 
UNION ALL 
(SELECT result FROM tbl2 LIMIT 1) 

manual about UNION इस मामले पर बहुत स्पष्ट है:

+0

धन्यवाद, यह बहुत अच्छा है। पूरे दौर में एक बदसूरत नौकरी की बिट, इसलिए मैं काम करता हूं जो कुछ करता है, जो यह करता है! –

+0

जब कोई प्रश्न PostgreSQL में बदसूरत हो जाता है, तो अक्सर नहीं, अधिक सुंदर समाधान कोने के आसपास होता है। ;) –

+0

यदि यह आपको परेशान करता है कि दिन के पहले से एक स्वीकृत उत्तर आपके अतिरिक्त जोड़ों के आधार पर बेहतर हुआ था, तो मैं इसे हटा दूंगा। लेकिन मैं एक स्वीकार्य उत्तर हटाने के लिए प्रतीत नहीं कर सकता। – Glenn

-1
create view my_data1 
AS 
with data as 
(
    select student_id,sum(marks) as total_marks 
    from marks_marks 
    group by 1 
) , 
data1 as 
(
    select id, name 
    from students_class 
), 
data2 as 
(
    select applicant_name, 
      id, 
      class_name 
    from students_students 
) 
select data2.applicant_name , 
     data1.name as class_name , 
     data.total_marks 
from data2 
join data1 on data1.id = data2.class_name 
join data on data.student_id = data2.id 



select * from my_data1 
+0

इस कोड स्निपेट के लिए धन्यवाद, जो कुछ सीमित अल्पकालिक सहायता प्रदान कर सकता है। एक उचित स्पष्टीकरण [बहुत सुधार होगा] (// meta.stackexchange.com/q/114762) यह दिखाकर इसका दीर्घकालिक मूल्य * क्यों * यह समस्या का एक अच्छा समाधान है, और भविष्य के पाठकों के साथ इसे और अधिक उपयोगी बना देगा अन्य, समान प्रश्न। आपके द्वारा किए गए अनुमानों सहित कुछ स्पष्टीकरण जोड़ने के लिए कृपया अपना उत्तर संपादित करें। –