这不是按表达式分组

This is not a group by expression

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

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

当我想从我的 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 运行 它时,一切正常。

有什么想法吗?

PS。当我将查询更改为这样的查询时,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;

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

decode(参数,'T',nvl(t1.version,'-'),t1.version), 总和(nvl(t1.liczba2,0))作为left_to_dispatch

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

请注意,我还用标准 SQL 函数 coalesce() 替换了 nvl()。使用旧的 Oracle 函数没有错:Oracle 仍然支持它们。但是,它们可以追溯到甲骨文 SQL 创新速度超过 ANSI 委员会跟上的时代。一般来说,第三方 "database agnostic" 工具与标准 SQL 比与产品特定 SQL 更好地工作。

我怀疑你的两个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;