সাব-কোয়েরিটি ব্যবহার করার সময় পোস্টগ্রাস ত্রুটি [কলামটি অবশ্যই গ্রুপের মাধ্যমে গ্রোপে উপস্থিত হতে হবে বা একটি সামগ্রিক ফাংশনে ব্যবহৃত হবে]


17

আমার দুটি টেবিল আছে employeeএবং phones। একজন কর্মীর 0 থেকে n ফোন নম্বর থাকতে পারে। আমি তাদের ফোন নম্বর সহ কর্মচারীর নাম তালিকা করতে চাই। আমি নীচের ক্যোয়ারীটি ব্যবহার করছি যা ভাল চলে runs

SELECT empname,array_agg(phonenumber) AS phonenumbers 
FROM employee LEFT OUTER JOIN phones ON employee.empid = phones.empid
GROUP BY employee.empid

এখানে চিত্র বর্ণনা লিখুন

কর্মচারী টেবিলে প্রচুর পরিমাণে সারি থাকতে পারে। আমি একবারে কেবলমাত্র কিছু কর্মী আনতে চাই। উদাহরণস্বরূপ আমি 3 জন কর্মী তাদের ফোন নম্বর সহ আনতে চাই। আমি এই কোয়েরিটি চালানোর চেষ্টা করছি।

SELECT empname,array_agg(phonenumber) AS phonenumbers 
FROM 
(SELECT * FROM employee ORDER BY empname LIMIT 3 OFFSET 0) AS employee 
LEFT OUTER JOIN phones ON employee.empid = phones.empid
GROUP BY employee.empid

তবে আমি এই ত্রুটি পেয়েছি। ERROR: column "employee.empname" must appear in the GROUP BY clause or be used in an aggregate function দুটি প্রশ্নের মধ্যে কেবলমাত্র পার্থক্য হ'ল আমি যোগদানের আগে সারিগুলিকে সীমাবদ্ধ করতে পরবর্তীগুলিতে সাব কোয়েরিটি ব্যবহার করছি। আমি কীভাবে এই ত্রুটিটি সমাধান করব?

উত্তর:


21

ক্লজটিতে একটি টেবিলের প্রাথমিক কীটি ব্যবহার করতে সক্ষম হওয়া GROUP BYএবং সেই টেবিলের অন্যান্য কলাম যুক্ত করার প্রয়োজন নেই এমন পোস্টগ্রিসের বৈশিষ্ট্য GROUP BYতুলনামূলকভাবে নতুন এবং কেবল বেস টেবিলের জন্যই কাজ করে। অপ্টিমাইজারটি (এখনও?) ভিউ, ব্রেস বা উত্সযুক্ত টেবিলগুলির জন্য প্রাথমিক কীগুলি সনাক্ত করার জন্য যথেষ্ট চালাক নয় (আপনার ক্ষেত্রে যেমন রয়েছে)।

আপনি কলাম আপনি চান যোগ করতে পারেন SELECTমধ্যে GROUP BYদফা:

SELECT e.empname, array_agg(p.phonenumber) AS phonenumbers 
FROM 
(SELECT * FROM employee ORDER BY empname LIMIT 3 OFFSET 0) AS e 
LEFT OUTER JOIN phones AS p ON e.empid = p.empid
GROUP BY e.empid, e.empname 
ORDER BY e.empname ;

বা একটি subquery ব্যবহার (এবং GROUP BYসেখানে স্থানান্তর ):

SELECT e.empname,
       (SELECT array_agg(p.phonenumber) 
        FROM phones AS p
        WHERE e.empid = p.empid
       ) AS phonenumbers 
FROM 
(SELECT * FROM employee ORDER BY empname LIMIT 3 OFFSET 0) AS e 
ORDER BY e.empname ;

যা এই হিসাবে লেখা যেতে পারে:

SELECT e.empname,
       (SELECT array_agg(p.phonenumber) 
        FROM phones AS p
        WHERE e.empid = p.empid
       ) AS phonenumbers 
FROM employee AS e
ORDER BY e.empname LIMIT 3 OFFSET 0 ;

যেহেতু আপনি সংস্করণ 9.3+ এ আছেন। আপনি একটি LATERALযোগদান ব্যবহার করতে পারেন :

SELECT e.empname,
       p.phonenumbers 
FROM 
   (SELECT * FROM employee ORDER BY empname LIMIT 3 OFFSET 0) AS e
LEFT JOIN LATERAL
   (SELECT array_agg(phonenumber) AS phonenumbers
    FROM phones 
    WHERE e.empid = phones.empid
   ) AS p ON TRUE 
ORDER BY e.empname ;

@ সাইপ্রুড ধন্যবাদ এটি একটি সহজ এবং পরিষ্কার উপায়।
প্রোগ্রামার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.