SQL 不能使用从 group by 中的子查询返回的列
Posted
技术标签:
【中文标题】SQL 不能使用从 group by 中的子查询返回的列【英文标题】:SQL doesn't work using a column returns from subquery in group by 【发布时间】:2018-11-20 16:19:54 【问题描述】:我需要运行如下查询,但它无法识别 SHOWNDATE。为什么会这样?
查询被简化为清晰:
select PYNAME,
SHOWNDATE=(SELECT MAX(OUTCOMETIME) FROM A where A.ID=B.ID),
count(PYSUBJECTID)
from B
group by PYNAME,
SHOWNDATE
【问题讨论】:
【参考方案1】:我认为在 Select 子句中写为 AS SHOWNDATE SHOWNDATE = 不对。
select
PYNAME,
(SELECT MAX(OUTCOMETIME) FROM A where A.ID=B.ID) AS SHOWNDATE,
count(PYSUBJECTID)
from B
group by PYNAME,SHOWNDATE
【讨论】:
【参考方案2】:这是一个基于 Scott 架构的示例,展示了如何做到这一点:
SQL> select b.deptno,
2 (select max(a.sal) from emp a where b.deptno = a.deptno) as showsal,
3 count(b.empno)
4 from emp b
5 group by b.deptno;
DEPTNO SHOWSAL COUNT(B.EMPNO)
---------- ---------- --------------
30 2850 6
20 3000 3
10 5000 3
SQL>
或者,应用于您的查询:
select b.pyname,
(select max(a.outcometime) from a where a.id = b.id) showndate,
count(b.pysubjectid)
from b
group by b.pyname;
不要忘记为所有列应用表别名!
【讨论】:
【参考方案3】:ALIAS(在本例中为 SHOWNDATE)不是一个有效的标识符,但它适用于来自子查询的结果集。使用别名是为了方便...没有人希望将“SELECT MAX(OUTCOMETIME) FROM A where A.ID=B.ID”作为列名。
select
PYNAME
,SHOWNDATE
,COUNT
from (
select PYNAME
,(SELECT MAX(OUTCOMETIME) FROM A where A.ID=B.ID) SHOWNDATE
,count(PYSUBJECTID) COUNT
from B
Group by PYNAME
)
group by PYNAME
,SHOWNDATE
,COUNT
【讨论】:
以上是关于SQL 不能使用从 group by 中的子查询返回的列的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Laravel 8 中使用 PostgreSQL 中的子查询通过 group by 子句获取行值?
使用SQL语言了解Django ORM中的分组(group by)和聚合(aggregation)查询
从多个表中创建 Sql Server VIEW GROUPing BY,选择子查询作为别名