这不是按表达式分组
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()
说法不完全一样。我的建议是您使用子查询,这样您就不必重复表达式。
我也更喜欢 case
和 coalesce()
(标准 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 连接 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()
说法不完全一样。我的建议是您使用子查询,这样您就不必重复表达式。
我也更喜欢 case
和 coalesce()
(标准 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;