查询在oracle版本上工作,但在其他版本上不工作
我有两个oracle版本,oracle Database 11g Enterprise Edition 11.2.0.1.0版-生产版和oracle Database 11g Enterprise Edition 11.2.0.3.0版-64位生产版 我有一个sql:查询在oracle版本上工作,但在其他版本上不工作,oracle,oracle11g,group-by,Oracle,Oracle11g,Group By,我有两个oracle版本,oracle Database 11g Enterprise Edition 11.2.0.1.0版-生产版和oracle Database 11g Enterprise Edition 11.2.0.3.0版-64位生产版 我有一个sql: select an.idai, t1.fecha, 53, t1.val_d60, 0 from ( select ides, cana, ctec, trunc(fecha_d60, 'MM') as fecha
select an.idai, t1.fecha, 53, t1.val_d60, 0
from
( select ides, cana, ctec, trunc(fecha_d60, 'MM') as fecha, val_d60,
row_number() over (partition by ides,cana,ctec, trunc(fecha_d60, 'MM')
order by val_d60 asc) as orden
from azul_estdata60
where idflagv = 11
and ides < 25
and fecha_d60 >= '01/01/2016' and fecha_d60 <= '31/12/2016'
and cana = 8
order by ides, cana, ctec, val_d60 desc
) t1,
( select ides, cana, ctec, trunc(fecha_d60, 'MM') as fecha,
round(count(*)*.5,0) as percentil
from azul_estdata60
where idflagv in (11,12,13)
and ides < 25
and fecha_d60 >= '01/01/2016' and fecha_d60 <= '31/12/2016'
and cana = 8
group by ides, cana, ctec, trunc(fecha_d60, 'MM')
) t2
inner join azul_analogin an
on an.cana = t2.cana
and an.ctec = t2.ctec and an.ides = t2.ides
where t1.ides = t2.ides
and t1.cana = t2.cana
and t1.ctec = t2.ctec
and t1.fecha = t2.fecha
and orden = percentil;
我能做些什么来解决这个问题
Thx.我不知道你为什么会出现这个错误。您的查询在语法上看起来不错。但是非常复杂。我试着重写一下。 首先,我将日期指定为日期。然后我排除第二个子查询并用第一个子查询编译它。结果我得到了下一个:
with azul_estdata60(cana, ctec, ides, fecha_d60,val_d60,idflagv ) as (
select 8,123, 1, date'2016-01-01',200, 11 from dual union all
select 8,123, 1, date'2016-01-03',2000, 11 from dual union all
select 8,123, 1, date'2016-01-05',2000, 11 from dual union all
select 8,123, 1, date'2016-01-06',20000, 11 from dual union all
select 8,123, 1, date'2016-01-10',200000, 11 from dual union all
select 8,123, 2, date'2016-02-01',201, 12 from dual union all
select 8,123, 3, date'2016-03-01',203, 13 from dual union all
select 8,123, 4, date'2016-04-01',205, 14 from dual union all
select 8,123, 5, date'2016-05-01',219, 13 from dual union all
select 8,123, 6, date'2017-01-01',260, 11 from dual )
, azul_analogin (cana, ctec, ides, IDAI) as (
select 8,123, 1,991 from dual
)
select an.idai, t2.fecha, 53, t2.val_d60, 0 , percentil, orden
from
( select ides, cana, ctec, trunc(fecha_d60, 'MM') as fecha, val_d60,
idflagv,
round( (count(*) over (partition by ides, cana, ctec, trunc(fecha_d60, 'MM')))*0.5,0) as percentil,
row_number() over (partition by idflagv, ides,cana,ctec, trunc(fecha_d60, 'MM')
order by val_d60 asc) as orden
from azul_estdata60
where idflagv in (11,12,13)
and ides < 25
and fecha_d60 >= date'2016-01-01' and fecha_d60 < date'2017-01-01'
and cana = 8
) t2
inner join azul_analogin an
on an.cana = t2.cana
and an.ctec = t2.ctec and an.ides = t2.ides
where 1 = 1
and orden = percentil
and idflagv = 11
“2016年1月1日”不是日期。Oracle可能会尝试使用NLS_date_FORMAT会话参数作为格式掩码隐式地将其转换为日期,但如果此掩码不匹配,则转换将失败,并且该参数可由每个用户在其会话中设置,因此,当参数更改时,调试会很困难,因为它可以为一个用户而不是其他用户工作。最好使用日期“01/01/2016”、“DD/MM/YYYY”或ANSI日期文字日期“2016-01-01”。NLS\U日期格式为“DD/MM/YYYY”,西班牙语格式,无论如何,我会更改日期,但我会不断收到相同的错误。您没有抓住要点—“01/01/2016”是字符串而不是日期。不管它是否适用于您,使用字符串表示日期和依赖隐式转换都是不好的做法,因为用户可以在会话中更改NLS_DATE_格式,这将中断所有依赖隐式转换的查询,而不会更改查询。唯一让人想到的是列之间可能不匹配像卡纳、卡尼亚或卡纳这样的名字。它们可能在代码和基表之间使用不一致;根据数据库设置的不同,一个可能认为它们相同,但另一个不同。如果select和group by之间的值不同,则可能会引发此错误。错误消息说这个错误发生的确切位置,你也能分享这个信息吗?我明白了,如果我将内部连接部分移动到t2子查询中,它就会工作,可能是oracle解析器中的错误?
with azul_estdata60(cana, ctec, ides, fecha_d60,val_d60,idflagv ) as (
select 8,123, 1, date'2016-01-01',200, 11 from dual union all
select 8,123, 1, date'2016-01-03',2000, 11 from dual union all
select 8,123, 1, date'2016-01-05',2000, 11 from dual union all
select 8,123, 1, date'2016-01-06',20000, 11 from dual union all
select 8,123, 1, date'2016-01-10',200000, 11 from dual union all
select 8,123, 2, date'2016-02-01',201, 12 from dual union all
select 8,123, 3, date'2016-03-01',203, 13 from dual union all
select 8,123, 4, date'2016-04-01',205, 14 from dual union all
select 8,123, 5, date'2016-05-01',219, 13 from dual union all
select 8,123, 6, date'2017-01-01',260, 11 from dual )
, azul_analogin (cana, ctec, ides, IDAI) as (
select 8,123, 1,991 from dual
)
select an.idai, t2.fecha, 53, t2.val_d60, 0 , percentil, orden
from
( select ides, cana, ctec, trunc(fecha_d60, 'MM') as fecha, val_d60,
idflagv,
round( (count(*) over (partition by ides, cana, ctec, trunc(fecha_d60, 'MM')))*0.5,0) as percentil,
row_number() over (partition by idflagv, ides,cana,ctec, trunc(fecha_d60, 'MM')
order by val_d60 asc) as orden
from azul_estdata60
where idflagv in (11,12,13)
and ides < 25
and fecha_d60 >= date'2016-01-01' and fecha_d60 < date'2017-01-01'
and cana = 8
) t2
inner join azul_analogin an
on an.cana = t2.cana
and an.ctec = t2.ctec and an.ides = t2.ides
where 1 = 1
and orden = percentil
and idflagv = 11