嗨,我有一个查询,给我以下错误:
ORA-01791: not a SELECTed expression
这是选择表达式,请你告诉我为什么?
declare
freqLettura varchar2(64);
billingcy varchar2(64);
begin
freqLettura := null;
billingcy := null;
for rec in ( select distinct(fn_get_facilityid(z.uidfacility) ) as a, 1 as b
from facilityhistory z,
locality l ,
plant p ,
ztmp_sam_tb_sdv zsdv ,
ztmp_sam_tb_plantcode zplant ,
sam_tb_ca_pdr sam,
meterhistory mh,
meter m ,
meterclass mc
where
Z.UIDLOCALITY = L.UIDLOCALITY and
p.UIDPLANT = L.UIDPLANT and
z.uidaccount = zsdv.uidaccount and
p.plantcode = zplant.plantcode and
sam.uidfacility = z.uidfacility and
z.stoptime is null and
sam.status = 'U' and
mh.uidfacility = z.uidfacility and
mh.uidmeter = m.uidmeter and
m.uidmeterclass = mc.uidmeterclass and
(billingcy is null or p.UIDBILLINGCYCLE = billingcy )
AND
(
(
(freqLettura = 'G') AND ( mh.corrmeterid is not null and mh.stoptime is null and mc.maxflowmeter >= SAM_FN_GET_PARAMETER_FLOAT('MAXFLOWMET_DETT_GIORN'))
)
OR
(
nvl(freqLettura,'nullo') <> 'G' AND (freqLettura is null or sam.readfrequency = freqLettura)
)
) and ROWNUM = 1 order by sam.stoptime, sam.uidsamtbpdr desc ) loop
begin
insert into ztmp_sam_tb_elab_pdr (facilityid, uidbatchrequest) VALUES (rec.a, rec.b);
exception
when dup_val_on_index then
null;
end;
end loop;
端;
答案 0 :(得分:1)
如果您在DISTINCT
查询中使用SELECT
,那么您的ORDER BY
子句应仅包含您选择的列。在这种情况下,sam.stoptime, sam.uidsamtbpdr
声明中没有SELECT
。您可以删除ORDER BY
子句,因为它在您的示例中没有做任何有用的事情。
答案 1 :(得分:1)
每当您收到您不理解的Oracle错误消息时,首先要做的就是查找含义。一种方法就是谷歌。在这种情况下, Oracle9i Database Error Messages中的完整说明是:
ORA-01791不是SELECTed表达式
原因:订单不正确 按项目。该查询是带有ORDER BY子句的SELECT DISTINCT查询。 在此上下文中,所有ORDER BY项必须是常量SELECT列表 表达式,或操作数为常量或SELECT的表达式 列表表达式。
操作:从SELECT列表中删除不适当的ORDER BY项 并重试该声明。
(奇怪的是,这个错误信息没有在10G或11G手册中记录,尽管仍然被提出!)
这与您编写的语句匹配,这是一个SELECT DISTINCT查询,您尝试按照未选择的列对结果进行排序。
如果您考虑一下,您要求的内容没有意义:通过选择不包含sam.stoptime的DISTINCT值(例如),您可能正在使用sam.stoptime的不同值合并许多行,因此哪一个会管理排序?
另外,正如Noel的回答所指出的那样,无论如何都没有理由在此代码中有ORDER BY子句,所以解决方案就是删除它。