ORA-00918:列定义模糊报错求助 复制可用SQL后运行失败
ORA-00918: 列定义模糊错误分析及解决
错误原因
出现ORA-00918错误的核心原因是:SQL中多个字段未指定所属表的别名,而这些字段在关联的baseintegrationheaders、baseMessages、basefaults表中存在同名,数据库无法确定要引用哪个表的字段。具体涉及的字段包括:STARTTIMESTAMP、bridgeid、requestType、RequestSpecification、requestMessage、faultindication。
修正方案
给所有模糊字段加上明确的表别名,确保数据库能唯一识别字段来源:
STARTTIMESTAMP:添加主表别名bint.前缀(查询和where条件中都需要)bridgeid:指定为bint.bridgeid(与where过滤条件保持一致)requestType:明确为bint.requestType(匹配where条件中的过滤逻辑)RequestSpecification:添加bint.前缀(若实际来自其他表,替换对应别名即可)requestMessage:case语句的判断条件中需写成bMes.requestMessage is not null,与后续字段引用保持一致faultindication:指定为bfa.faultindication(关联表basefaults的字段,符合业务逻辑)
修正后的完整SQL
select to_char(bint.STARTTIMESTAMP, 'yyyymmdd hh24:mi:ss DY') as "DATE", bint.bridgeid, bint.requestType, bint.RequestSpecification, bfa.faultdescription, case when bMes.requestMessage is not null then dbms_lob.substr(substr(bMes.requestMessage, INSTR(bMes.requestMessage, 'SourceSystem', 1) + length('SourceSystem') + 1, (INSTR(bMes.requestMessage, 'SourceSystem', 1, 2) - INSTR(bMes.requestMessage, 'SourceSystem', 1) - length('SourceSystem') - 3))) end as sourceSystem, case when bMes.requestMessage is not null then dbms_lob.substr(substr(bMes.requestMessage, INSTR(bMes.requestMessage, 'EventId', 1) + length('EventId') + 1, (INSTR(bMes.requestMessage, 'EventId', 1, 2) - INSTR(bMes.requestMessage, 'EventId', 1) - length('EventId') - 3))) end as EventId, bint.MessageId, bint.relatesto, systimestamp from baseintegrationheaders bint left join baseMessages bMes on bMes.relatesto = bint.relatesto left join basefaults bfa on bfa.relatesto = bint.relatesto where 1 = 1 and bint.STARTTIMESTAMP Between (trunc(systimestamp, 'hh') + floor(to_char(systimestamp, 'mi') / 15) * 15 / 1440) - 15 / 1440 And trunc(systimestamp, 'hh') + floor(to_char(systimestamp, 'mi') / 15) * 15 / 1440 and bint.technicaldomain = 'WB' and bint.bridgeid in ('AST_GPSBatch_Reply-bridge', 'AST_GPSOnline_Reply-bridge', 'AST_GPS_Request-bridge') and bint.requestType not in ( 'WorkerRunning' , 'BridgeEnd' , 'BridgeStart' , 'WorkerEnd' , 'WorkerMQEnd' , 'WorkerMQStart' , 'WorkerProducerEnd' , 'WorkerProducerStart' , 'WorkerReaderEnd' , 'WorkerReaderStart' , 'WorkerStart' , 'WorkerStop' ) and ((bint.requestType = 'BridgeRequest' and bfa.faultindication = 'true') or (bint.requestType <> 'BridgeRequest')) order by bint.MessageId, 1 ;
内容的提问来源于stack exchange,提问作者Beerus239
相关产品推荐
相关产品推荐

