【问题标题】:This is not a group by expression这不是按表达式分组
【发布时间】:2020-04-20 08:33:56
【问题描述】:

首先,我使用 ORM 连接并从 Oracle DB 获取数据。

当我从某个数据库管理工具调用我的存储过程时,一切正常。

当我想从我的 ORM 运行它时,问题就开始了。 它给出了一个错误:

ORA-00979: this is not a group by expression.

这通常发生在未聚合或非恒定数据、未按分句出现在组中时。

该查询包含在存储过程中,因此每次我尝试运行它时都是一样的,并且它具有按子句分组所需的所有内容。

我什至登录到同一个 oracle 用户。我也做了一些痕迹,但没有什么奇怪的。

查询看起来像:

 for rec in (
select t1.field1,
      t1.field2,
      t1.field3,
      t1.field4,
      t1.field5,
      decode(parameter,'T',nvl(t1.version, '-'),t1.version),
      sum(nvl(t1.liczba2,0)) as left_to_dispatch
    from table_1 t1 
    group by
      t1.field1,
      t1.field2,
      t1.field3,
      t1.field4,
      t1.field5,
      decode(parameter,'T',nvl(t1.version, '-'),t1.version)) 
  loop 
    null; 
  end_loop;

问题是:ORM 是否可以在数据库中(而不是在会话中)设置任何可能导致此类错误的设置?

顺便说一句。我尝试将解码替换为大小写:我遇到了同样的错误。

我尝试将解码替换为 NVL,我得到了同样的错误。

但错误只是来自这个 ORM 工具,当我尝试从 PLSQL Developer 运行它时,一切正常。

有什么想法吗?

附言。当我将查询更改为这样的查询时,ORM 工作正常:

for rec in (
    select t1.field1,
          t1.field2,
          t1.field3,
          t1.field4,
          t1.field5,
          t1.version,
          sum(nvl(t1.liczba2,0)) as left_to_dispatch
        from table_1 t1 
        group by
          t1.field1,
          t1.field2,
          t1.field3,
          t1.field4,
          t1.field5,
          t1.version)
      loop 
        null; 
      end_loop;

【问题讨论】:

  • 你的 ORM 工具是什么?我们可能需要知道这一点。另外,请在您调用此查询的地方包含相关代码。
  • 做了一些修改。

标签: sql oracle group-by orm decode


【解决方案1】:

我怀疑您的两个decode() 语句并不完全相同。我的建议是使用子查询,然后就不必重复表达式。

我也更喜欢 casecoalesce()(标准 SQL 结构),所以:

select t1.field1, t1.field2, t1.field3, t1.field4, t1.field5, new_version,
       sum(coalesce(t1.liczba2, 0)) as left_to_dispatch
from (select t1.*
             (case when parameter = 'T' then coalesce(t1.version, '-') else t1.version end) as new_version
      from table_1 t1 
     ) t1
group by t1.field1, t1.field2, t1.field3, t1.field4, t1.field5, new_version;

【讨论】:

  • 嗯,也许 ORM 确实以某种方式看到了这些解码,而不是我的眼睛和其他工具。你给了我好主意,我正在检查。
  • 好吧,因为毫无疑问 ORM 有问题,而且我想在不知道内部代码的情况下猜测可能有什么问题是毫无意义的,我将您的答案标记为可以解决的答案问题。现在查询返回与以前相同的结果,并且它们在这两种工具中都可以使用。感谢您的帮助!
【解决方案2】:

decode() 是一个旧的 Oracle 函数,您的 ORM 可能无法解释它。为什么不改用case?它是标准 SQL,因此 ORM 可能更容易处理。

select t1.field1,
      t1.field2,
      t1.field3,
      t1.field4,
      t1.field5,
      case when parameter = 'T' then coalesce(t1.version, '-') else t1.version end,
      sum(nvl(t1.liczba2,0)) as left_to_dispatch
    from table_1 t1 
    group by
      t1.field1,
      t1.field2,
      t1.field3,
      t1.field4,
      t1.field5,
      case when parameter = 'T' then coalesce(t1.version, '-') else t1.version end

请注意,我还将nvl() 替换为标准SQL 函数coalesce()。使用旧的 Oracle 函数并没有错:Oracle 仍然支持它们。但是,它们可以追溯到甲骨文的 SQL 创新速度超过 ANSI 委员会能够跟上的速度。一般来说,第三方“与数据库无关”的工具与标准 SQL 相比,与产品特定的 SQL 一起工作得更好。

【讨论】:

  • 尝试了 +/- 正是你在这里所做的,但案例也无法正常工作。似乎是一个错误......我刚刚尝试了你所做的,同样的情况:ORM 中的错误,PLSQL Developer 中没有错误。
  • 我也赞成你的回答,因为 ORM 确实在通过 clausule 解释高于正常字段的任何内容时遇到问题。感谢您的努力。
【解决方案3】:

可能是你忘记了后面的逗号 解码(参数,'T',nvl(t1.version, '-'),t1.version)

decode(参数,'T',nvl(t1.version, '-'),t1.version), sum(nvl(t1.liczba2,0)) as left_to_dispatch

【讨论】:

猜你喜欢
  • 2011-05-25
  • 2010-12-03
  • 1970-01-01
  • 1970-01-01
  • 2021-05-27
  • 1970-01-01
  • 1970-01-01
  • 2013-10-13
  • 1970-01-01
相关资源
最近更新 更多