PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

त्रुटि:सबक्वेरी को केवल एक कॉलम वापस करना होगा

FROM . में एक से अधिक कॉलम लौटाने वाली सबक्वेरी रखें सूची बनाएं और उसमें से चुनें.

शुरू करने के लिए एक सहसंबंधित सबक्वायरी एक बुरा विचार होगा। हालांकि, आपकी क्वेरी सहसंबद्ध भी नहीं है, लेकिन असंबंधित (बाहरी क्वेरी के लिए कोई लिंक नहीं) और कई पंक्तियों को वापस करने लगता है। यह एक कार्टेशियन उत्पाद का उत्पादन करने के लिए (संभवतः बहुत महंगा और निरर्थक) क्रॉस जॉइन की ओर जाता है, शायद आपका (गुप्त) इरादा नहीं है।

ऐसा लगता है कि आप वाकई चाहते हैं:

SELECT m1.mat AS mat1, m1.sumtotal AS sumtotal1
      ,m2.mat AS mat2, m2.sumtotal AS sumtotal2
FROM (
   SELECT mat.mat, sum(stx.total) AS sumtotal
   FROM   stx 
   LEFT   JOIN mat ON mat.matid = stx.matid
   LEFT   JOIN sale ON stx.saleid = sale.id
   WHERE  stx.date BETWEEN '2013-05-01' AND '2013-08-31'
   AND    sale.userid LIKE 'A%'
   GROUP  BY mat.mat
   ) m1
JOIN  (
   SELECT mat.mat, sum(stx.total) AS sumtotal
   FROM   stx 
   LEFT   JOIN mat ON mat.matid = stx.matid
   LEFT   JOIN sale ON sale.id = stx.saleid
   WHERE  stx.date BETWEEN '2013-05-01' AND '2013-08-31' 
   AND    sale.userid LIKE 'b%'
   GROUP  BY mat.mat
   ) m2 USING (mat);

दोनों LEFT JOIN भी व्यर्थ हैं। एक sale . पर एक INNER JOIN के लिए मजबूर किया जाता है WHERE की स्थिति से। मैट पर एक व्यर्थ लगता है, क्योंकि आप GROUP BY mat.mat - सिवाय इसके कि आप mat IS NULL में रुचि रखते हैं ? (मुझे शक है।)

शायद इस मामले को और सरल बनाया जा सकता है:

SELECT m.mat
      ,sum(CASE WHEN s.userid LIKE 'A%' THEN x.total END) AS total_a
      ,sum(CASE WHEN s.userid LIKE 'B%' THEN x.total END) AS total_b
FROM   sale s 
JOIN   stx  x ON x.saleid = s.id
JOIN   mat  m ON m.matid = x.matid
WHERE (s.userid LIKE 'A%' OR s.userid LIKE 'B%')
AND    x.date BETWEEN '2013-05-01' AND '2013-08-31'
GROUP  BY 1;

WHERE आपके गुप्त डेटा प्रकारों और सूचकांकों के आधार पर स्थिति को संभवतः और सरल बनाया जा सकता है। dba.SE पर यह संबंधित उत्तर



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. क्या मैं इकाई फ्रेमवर्क कोर में कनेक्ट डेटाबेस पर एक घटना को आग लगा सकता हूं?

  2. किसी डेटाबेस के अंदर कुछ तालिकाओं के स्वामित्व को पोस्टग्रेज़ से दूसरे उपयोगकर्ता में कैसे बदलें?

  3. विशिष्ट jsonb सरणी मान को अद्यतन करने के लिए jsonb_set() का उपयोग करना

  4. SQL में सेट किए गए परिणाम में प्रत्येक कॉलम में तालिका का नाम तैयार करें? (विशेष रूप से पोस्टग्रेज)

  5. एसक्यूएल कॉलम के रूप में पंक्तियों को स्थानांतरित करें