sql >> Database teknologi >  >> RDS >> PostgreSQL

fejl:underforespørgsel må kun returnere én kolonne

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 .



  1. Flere muligheder for LINES TERMINATED BY og FIELDS TERMINATED BY - MySQL

  2. Optimer en UNION mysql-forespørgsel

  3. Hvordan opretter man forbindelse til MySQL på Amazon EC2 fra Windows?

  4. Hvordan får man adgang til fjernserver med lokal phpMyAdmin-klient?