ORA-00979: 在使用子查询查询视图时不是 GROUP BY 表达式

Posted

技术标签:

【中文标题】ORA-00979: 在使用子查询查询视图时不是 GROUP BY 表达式【英文标题】:ORA-00979: not a GROUP BY expression while querying a View with a subquery 【发布时间】:2013-05-29 14:43:07 【问题描述】:

我的视图如下 - 它编译得很好,但是当我尝试从中选择时,我得到 ORA-00979: not a GROUP BY 表达式错误。如果我从视图中消除子查询(第 4 列),一切正常。任何想法将不胜感激!谢谢!!

select
    l.LAB_GROUP,
    l.NAME as LAB,
    b.NAME as BENCH,
    (select count(distinct s2.SAMPLE_NUMBER)
    from SAMPLE s2 inner join TEST t2 on s2.SAMPLE_NUMBER = t2.SAMPLE_NUMBER and t2.STATUS            in ('C', 'R') and s2.TEMPLATE <> 'QC_SAMPLE'
    inner join LABORATORY_ENTRY le2 on t2.ANALYSIS = le2.ANALYSIS
    where s2.LAB_GROUP = l.LAB_GROUP and le2.NAME = l.NAME and t2.X_BENCH = b.NAME and
    ((select count(t1.TEST_NUMBER)
    from TEST t1
    where t1.SAMPLE_NUMBER = t2.SAMPLE_NUMBER and t1.ANALYSIS = t2.ANALYSIS and t1.STATUS   <> 'R') = 0)) as RFR
from LABORATORY l
inner join LABORATORY_ENTRY le on le.NAME = l.NAME 
inner join X_BENCH b on b.NAME = le.X_BENCH
left join (SAMPLE s inner join TEST t on s.SAMPLE_NUMBER = t.SAMPLE_NUMBER and s.STATUS <> 'U'
and s.TEMPLATE <> 'QC_SAMPLE' and t.STATUS in ('I', 'P')) on t.ANALYSIS = le.ANALYSIS and s.LAB_GROUP = l.LAB_GROUP
left join V_LOC_DEPT_FAC ldf on ldf.LOCATION_NUMBER = s.STORAGE_LOC_NO 
group by l.LAB_GROUP, l.NAME, b.NAME 

【问题讨论】:

作为旁注,您可能需要考虑物化视图而不是视图,因为这看起来像一个昂贵的查询。 您似乎不需要GROUP BY 子句,因为您没有任何聚合函数作为选择的一部分; COUNT 函数位于第 4 列的子查询中,而不是主子句的一部分。但是,如果您将这些子查询改为连接,这可能会更容易维护...... 谢谢.. 计划是最终创建一个物化视图。 【参考方案1】:

如果您需要使用 group by(如果您添加聚合函数就会出现这种情况,但不是当前编写的查询),您还需要在 group by 中包含子查询。您可以通过在主查询之外添加SELECT 并在该级别应用GROUP BY 来添加这个最简单的方法:

select lab_group, lab, bench, rfr
from 
(
   select
      l.LAB_GROUP as lab_group,
      l.NAME as LAB,
      b.NAME as BENCH,
      (select .....) as RFR
   from LABORATORY l
      inner join LABORATORY_ENTRY le on le.NAME = l.NAME 
      inner join X_BENCH b on b.NAME = le.X_BENCH
      left join (SAMPLE s inner join TEST t on ...) on 
          t.ANALYSIS = le.ANALYSIS and 
          s.LAB_GROUP = l.LAB_GROUP
      left join V_LOC_DEPT_FAC ldf on ldf.LOCATION_NUMBER = s.STORAGE_LOC_NO 
) x
group by lab_group, lab, bench, rfr

【讨论】:

【参考方案2】:

尝试删除...

group by l.LAB_GROUP, l.NAME, b.NAME

如果您在子查询中进行计数,我认为这是不必要的。

但是,出于性能原因,我建议重写您的查询,以便将子查询移动到 FROM 部分而不是 SELECT 部分。

【讨论】:

谢谢...我的视图要大得多,它确实包含某些计数,因此我需要分组。为简洁起见,我删除了这些行。我同意,这是一个代价高昂的视图,我们正在对其进行调整。

以上是关于ORA-00979: 在使用子查询查询视图时不是 GROUP BY 表达式的主要内容,如果未能解决你的问题,请参考以下文章

SQLDeveloper 运行查询,但从休眠中获得“ORA-00979: Not a Group By expression”

SQL 组错误 ORA-00979

Hibernate namedquery 抛出 ORA-00979: not a GROUP BY 表达式

SQLSyntaxErrorException: ORA-00979: 不是 GROUP BY 表达式

关于ORA-00979 不是 GROUP BY 表达式错误的解释

为啥这不起作用? ORA-00979: 不是 GROUP BY 表达式