PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

грешка:подзаявката трябва да върне само една колона

Поставете подзаявка, която връща множество колони в 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. Този на mat изглежда безсмислен, тъй като вие 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 .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Вижте грешка в PostgreSQL

  2. Postgres SQL заявка за обобщаване на данни за грешки

  3. Начален масив във функция за агрегиране на многоизмерен масив

  4. Работен процес за обработка на последователни миграции и инициализация?

  5. Не може да влезе в системния потребител postgres