Indsæt en underforespørgsel, der returnerer flere kolonner i FROM
liste og vælg fra den.
En korreleret underforespørgsel ville være en dårlig idé til at begynde med. Din forespørgsel er dog ikke engang korreleret, men irelateret (intet link til ydre forespørgsel) og ser ud til at returnere flere rækker. Dette fører til (muligvis meget dyrt og meningsløst) krydsforbindelse, der producerer et kartesisk produkt, sandsynligvis ikke din (hemmelige) hensigt.
Det ser ud til, at du virkelig ønsker:
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);
Begge LEFT JOIN
er også meningsløse. Den på sale
er tvunget til en INNER JOIN
efter WHERE-tilstanden. Den på måtten virker meningsløs, da du GROUP BY mat.mat
- undtagen hvis du er interesseret i mat IS NULL
? (Jeg tvivler på det.)
Sagen kan formentlig yderligere forenkles til:
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
tilstand kan sandsynligvis forenkles yderligere, afhængigt af dine hemmelige datatyper og indekser. En bådfuld information om netop den sag i dette relaterede svar på dba.SE
.