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 पर यह संबंधित उत्तर
।