PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Fehler:Unterabfrage darf nur eine Spalte zurückgeben

Fügen Sie in FROM eine Unterabfrage ein, die mehrere Spalten zurückgibt Liste und wählen Sie daraus aus.

Eine korrelierte Unterabfrage wäre für den Anfang eine schlechte Idee. Ihre Abfrage ist jedoch nicht einmal korreliert, sondern unrelativ (kein Link zur äußeren Abfrage) und scheint mehrere Zeilen zurückzugeben. Dies führt zu einer (möglicherweise sehr teuren und unsinnigen) Kreuzverbindung, die ein kartesisches Produkt erzeugt, wahrscheinlich nicht Ihre (geheime) Absicht.

Sieht so aus, als ob Sie wirklich wollen:

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);

Beide LEFT JOIN sind auch sinnlos. Der im sale wird zu einem INNER JOIN gezwungen durch die WHERE-Bedingung. Das auf mat erscheint sinnlos, da Sie GROUP BY mat.mat verwenden - außer wenn Sie an mat IS NULL interessiert sind ? (Ich bezweifle es.)

Der Fall kann wahrscheinlich weiter vereinfacht werden zu:

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;

Das WHERE Bedingung kann wahrscheinlich weiter vereinfacht werden, abhängig von Ihren geheimen Datentypen und Indizes. Eine Schiffsladung Informationen zu genau diesem Fall in diese verwandte Antwort auf dba.SE .