Sql 错误:子查询只能返回一列

Sql 错误:子查询只能返回一列,sql,postgresql,join,left-join,cross-join,Sql,Postgresql,Join,Left Join,Cross Join,当我尝试运行以下查询时,我发现错误子查询必须只返回一列: SELECT mat.mat as mat1, sum(stx.total ) as sumtotal1, ( SELECT mat.mat as mat, sum(stx.total) as sumtotal FROM stx LEFT JOIN mat ON stx.matid = mat.matid LEFT JOIN sale ON stx.saleid = sale.id

当我尝试运行以下查询时,我发现错误子查询必须只返回一列:

SELECT mat.mat as mat1, sum(stx.total ) as sumtotal1,
  (
    SELECT mat.mat  as mat, sum(stx.total)  as sumtotal
    FROM stx 
      LEFT JOIN mat ON stx.matid = mat.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
) AS MyField
FROM stx 
  LEFT JOIN mat ON stx.matid = mat.matid
  LEFT JOIN sale ON stx.saleid = sale.id
WHERE stx.date BETWEEN '2013-05-01' AND '2013-08-31'
  AND sale.userid LIKE 'B%'
GROUP BY mat.mat

导致此错误的原因是什么?

而不是子查询select语句

SELECT mat.mat  as mat, sum(stx.total)  as sumtotal
SELECT sum(stx.total)  as sumtotal
试试这句话

SELECT mat.mat  as mat, sum(stx.total)  as sumtotal
SELECT sum(stx.total)  as sumtotal

在“发件人”列表中放置一个返回多列的子查询并从中选择

一开始使用相关子查询是个坏主意。然而,您的查询甚至并没有关联,但并没有到外部查询的链接,并且似乎返回多行。这可能会导致非常昂贵和荒谬的交叉连接产生笛卡尔积,这可能不是您的秘密意图

看起来你真的想要:

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);
两个左连接也都没有意义。根据WHERE条件,正在出售的一个必须进行内部连接。mat上的那个似乎毫无意义,因为您是按mat.mat分组的-除非您对mat感兴趣,否则它是空的?我对此表示怀疑

这种情况可能进一步简化为:

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条件可能会进一步简化,具体取决于您的机密数据类型和索引。在。

@user2431581中,您正通过子查询定义字段MyField。执行此操作时,子查询必须仅返回一个值和一个字段。您正在返回mat.mat以及sumstx.total。这是非法的SQL语法。请尝试此状态。SELECT sumstx.total as SUMTOAL错误:用作表达式的子查询返回多行放置在“发件人”列表中返回多列的子查询并从中选择。。这非常感谢。如果对具有多个OUT参数的函数执行select,但该函数不返回记录、集合或任何类似类型,并且该函数无法更改,该怎么办?例如,假设一个函数有两个out参数“hi”和“lo”,这样常规用法会返回一个记录元组,如4、5。但是select*将以两列形式分别返回结果。现在假设您希望在某个联接结果的多个列上执行该函数。比如从tabA中选择my_funca.colA,b.colB,在a.id=b.id上加入tabB。这是无可奉告的。我建议你用必要的信息开始一个新问题。你可以随时链接到这一个作为参考,并删除评论链接到相关问题并通知我。有一个解决方案…好的建议。这是一个很好的解决方案救了我的命谢谢兄弟