栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

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

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

将一个返回多列的子查询放在

FROM
列表中,然后从中选择。

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

看起来您确实想要:

SELECt m1.mat AS mat1, m1.sumtotal AS sumtotal1      ,m2.mat AS mat2, m2.sumtotal AS sumtotal2FROM (   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   ) m1JOIN  (   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
也都是毫无意义的。WHERe条件将一个
sale
强制为a
INNER JOIN
。垫子上的那个似乎毫无意义,因为您
GROUPBY 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_bFROM   sale s JOIN   stx  x ON x.saleid = s.idJOIN   mat  m ON m.matid = x.matidWHERe (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的相关答案中,提供了大量有关该情况的信息。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/670359.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号