sql >> Databasteknik >  >> RDS >> PostgreSQL

fel:underfrågan måste endast returnera en kolumn

Lägg en underfråga som returnerar flera kolumner i FROM lista och välj från den.

En korrelerad underfråga skulle vara en dålig idé till att börja med. Din fråga är dock inte ens korrelerad, utan orelaterade (ingen länk till yttre fråga) och verkar returnera flera rader. Detta leder till (möjligen mycket dyrt och meningslöst) korskoppling som producerar en kartesisk produkt, förmodligen inte din (hemliga) avsikt.

Det verkar som att du verkligen vill:

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

Båda LEFT JOIN är också meningslösa. Den på sale tvingas till en INNER JOIN efter villkoret WHERE. Den på mattan verkar meningslös, eftersom du GROUP BY mat.mat - förutom om du är intresserad av mat IS NULL ? (Jag tvivlar på det.)

Fallet kan förmodligen förenklas ytterligare till:

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 skick kan förmodligen förenklas ytterligare, beroende på dina hemliga datatyper och index. En båtladd med information om just det fallet i det här relaterade svaret på dba.SE .



  1. tidszonsavstämning med SQL

  2. Skapa eller simulera tvådimensionella arrayer i PL/SQL

  3. Mysql - Analysfel (syntaxfel) i min kod

  4. Hur SHOWPLAN_XML fungerar i SQL Server