2012-06-07 12 views
46

हाय, मैं एक दो तालिकाओंPostgresql कुल सरणी

Student 
-------- 
Id Name 
1 John  
2 David 
3 Will 

Grade 
--------- 
Student_id Mark 
1   A 
2   B 
2   B+ 
3   C 
3   A 

यह संभव देशी Postgresql बनाने के लिए इस तरह के परिणाम प्राप्त करने के लिए चयन किया गया है:

Name Array of marks 
----------------------- 
'John',  {'A'} 
'David', {'B','B+'} 
'Will',  {'C','A'} 

लेकिन नहीं की तरह इस

Name Mark 
---------------- 
'John',  'A' 
'David', 'B' 
'David', 'B+' 
'Will',  'C' 
'Will',  'A' 

उत्तर

80

उपयोग array_agg: http://www.sqlfiddle.com/#!1/5099e/1

SELECT s.name, array_agg(g.Mark) as marks   
FROM student s 
LEFT JOIN Grade g ON g.Student_id = s.Id 
GROUP BY s.Id 

वैसे, आप Postgres 9.1 का उपयोग कर रहे हैं, तो आप don't need to repeat ग्रुप के चयन पर कॉलम द्वारा, उदाहरण के लिए आपको GROUP BY पर छात्र नाम दोहराने की आवश्यकता नहीं है। आप केवल प्राथमिक कुंजी पर ग्रुप बाय कर सकते हैं। यदि आप छात्र पर प्राथमिक कुंजी को हटाते हैं, तो आपको ग्रुप बाय पर छात्र नाम दोहराना होगा।

CREATE TABLE grade 
    (Student_id int, Mark varchar(2)); 

INSERT INTO grade 
    (Student_id, Mark) 
VALUES 
    (1, 'A'), 
    (2, 'B'), 
    (2, 'B+'), 
    (3, 'C'), 
    (3, 'A'); 


CREATE TABLE student 
    (Id int primary key, Name varchar(5)); 

INSERT INTO student 
    (Id, Name) 
VALUES 
    (1, 'John'), 
    (2, 'David'), 
    (3, 'Will'); 
+2

हे भगवान आप का चयन करें/समूह के बारे में अपनी टिप्पणी के बारे में बहुत बहुत धन्यवाद, कि इतने बेहतरीन है! वह वास्तव में कष्टप्रद था! – mrbrdo

4

मैं समझता हूँ कि तुम क्या कुछ इस तरह कर सकते हैं:

SELECT p.p_name, 
    STRING_AGG(Grade.Mark, ',' ORDER BY Grade.Mark) As marks 
FROM Student 
LEFT JOIN Grade ON Grade.Student_id = Student.Id 
GROUP BY Student.Name; 

संपादित

मुझे यकीन है कि नहीं हूँ। लेकिन हो सकता है कुछ इस तरह तो:

SELECT p.p_name,  
    array_to_string(ARRAY_AGG(Grade.Mark),';') As marks 
FROM Student 
LEFT JOIN Grade ON Grade.Student_id = Student.Id 
GROUP BY Student.Name; 

संदर्भ here

+0

मैं वह एक pgsql सरणी, नहीं अल्पविराम से अलग की स्ट्रिंग चाहता – ThiefMaster

+0

जवाब अद्यतन लगता है – Arion