ORA-01799 列不能外部联接到子查询

需求及问题

在一些表关联查询中,当存在源表和关联表都有过虑条件(and)时,如果其中一个条件不符合,结果就有可能为空;

而实际上我们要求结果集中,条件不符合的显示空,但其它条件正常的,依然要显示。

1.要达到目的,不符合的数据显示为空,符合的照常显示


2.直接在where里放入条件,当有一个不符合时,结果集可能为空

/*需求和问题*/
/*1.where中放两个查询条件,有可能数据集为空*/
selec distinct t t.sec_code, t.sec_sname, 
decode(t1.chng_pct,null,'--',TO_CHAR(t1.chng_pct,'FM9999999999999990.90')) chng_pct, t.trans_type, t.tradedate 
from mv_stk_trans_info t left outer join mv_sec_mkt t1 on t.sec_unicode = t1.sec_unicode 
where t.tradedate=(select max(tradedate) from mv_stk_trans_info ) 
and t1.tradedate=(select max(tradedate) from mv_stk_trans_info )
order by t.sec_code asc; 

3.把限制为空列的条件放到outer join的on中,要报ORA-01799:列不能外部联接到子查询的错

/*2.把限制为空列的条件放到outer join的on中,要报ORA-01799:列不能外部联接到子查询的错*/
select distinct t.sec_code, t.sec_sname, 
decode(t1.chng_pct,null,'--',TO_CHAR(t1.chng_pct,'FM9999999999999990.90')) chng_pct, t.trans_type, t.tradedate 
from mv_stk_trans_info t 
left outer join mv_sec_mkt t1 on t.sec_unicode = t1.sec_unicode 
and t1.tradedate=(select max(tradedate) from mv_stk_trans_info )
where t.tradedate=(select max(tradedate) from mv_stk_trans_info ) 
order by t.sec_code asc;


解决方案

1.先查询出关联表的关联列,条件列,以及其它需要的列,查询结果集作为一个表,再让其它表来关联这个结果集

/*(推荐)1.先查询出关联表的关联列,条件列,以及其它需要的列,查询结果集作为一个表,再让其它表来关联这个结果集*/
/*方案1,速度运行为0.938*/
select distinct t.sec_code, t.sec_sname, 
decode(t1.chng_pct,null,'--',TO_CHAR(t1.chng_pct,'FM9999999999999990.90')) chng_pct, t.trans_type, t.tradedate 
from mv_stk_trans_info t left outer join 
(select sec_unicode, chng_pct from mv_sec_mkt  
where tradedate=(select max(tradedate) from mv_sec_mkt)) t1 on t.sec_unicode=t1.sec_unicode 
where t.tradedate=(select max(tradedate) from mv_stk_trans_info )
order by t.sec_code asc; 

2.先用一个函数来完成关联表的限制条件,并返回限制条件,再在outer join的on中加入限制条件

/*2.先用一个函数来完成关联表的限制条件,并返回限制条件,再在outer join的on中加入限制条件*/
/*方案2,速度运行为3.922*/
--函数返回关联条件
create or replace function fun_getMaxDay return date as
  v_max_date date;
begin
  select max(tradedate) into v_max_date from mv_stk_trans_info;
  return v_max_date;
end;

--关联查询
select t.sec_code, t.sec_sname, 
decode(t1.chng_pct,null,'--',TO_CHAR(t1.chng_pct,'FM9999999999999990.90')) chng_pct, t.trans_type, t.tradedate 
from mv_stk_trans_info t left outer join mv_sec_mkt t1 on t.sec_unicode = t1.sec_unicode 
and t1.tradedate=fun_getMaxDay 
where t.tradedate=(select max(tradedate) from mv_stk_trans_info ) 
order by t.sec_code asc;
方案1.2均能达到目的,但方案1用时少,且方便,推荐1。



### 关于 Oracle 数据库错误代码 ORA-01458、ORA-01157 和 ORA-01110 的原因及解决方案 #### 错误描述与可能原因 1. **ORA-01458**: 此错误表示尝试插入或更新的数据违反了唯一约束条件。具体来说,数据中存在重复值或者 NULL 值不符合索引定义的要求[^1]。此问题通常发生在创建唯一索引时,表中的某些已经包含了重复值。 2. **ORA-01157**: 这一错误表明无法获取控制文件所需的资源锁。常见原因是磁盘空间不足、操作系统级别的锁定冲突或其他进程正在占用相关资源[^4]。 3. **ORA-01110**: 该错误提供了受影响的数据文件名称及其编号的信息。它通常是其他更严重错误(如 ORA-01157 或 ORA-01119)的一部分,用于指示具体的文件路径和位置。 --- #### 解决方案 ##### 对于 ORA-01458: 为了修复这一问题,可以采取以下措施: - 验证目标字段是否存在重复值: ```sql SELECT column_name, COUNT(*) FROM table_name GROUP BY column_name HAVING COUNT(*) > 1; ``` - 如果发现重复记录,则需要清理这些冗余数据后再重新执行操作。 - 确认是否允许 NULL 值参与唯一索引构建;如果不允许,在设计阶段应避免这种情况发生。 ##### 对于 ORA-01157: 针对此类情况可考虑如下处理方式: - 检查是否有足够的可用存储容量来满足数据库需求; - 查看系统日志以识别潜在的竞争者并终止不必要的会话; - 使用 `ALTER SYSTEM CHECKPOINT` 手动触发检查点从而释放部分已修改缓冲区到磁盘上。 ##### 对于 ORA-01110: 由于这是辅助性的诊断消息而非独立存在的异常状况,因此重点在于解决引发它的根本性事件 (比如前面提到过的那些)。一旦基础层面恢复正常运作之后,这类提示自然也会消失不见。 ```bash ls -lh $(grep 'datafile' mesdb2_ora_5920.trc | awk '{print $NF}') ``` 上述命令可以帮助快速定位实际物理文件大小与其逻辑结构之间的一致性状态[^3]。 --- #### 总结 通过以上分析可以看出每种类型的报错背后都隐藏着特定的技术背景以及相应的调试技巧。当面对复杂场景下的多重叠加型故障现象时,建议按照先易后难的原则逐一排查直至最终找到症结所在为止。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值