Sql ORACLE左外部联接问题(表为空?)
我想知道为什么这个问题:Sql ORACLE左外部联接问题(表为空?),sql,oracle,Sql,Oracle,我想知道为什么这个问题: select l.objectID LEFT_CODE, r.object_code RIGHT_CODE from OGGETTO_ORGANIZZATIVO l left outer join ANAG_OGGETTO_ORGANIZZATIVO r on l.objectID = r.objectID WHERE r.objectID IS NULL; 返回一些行,而另一个查询 select l.objectID LEFT_CODE from OGGET
select l.objectID LEFT_CODE, r.object_code RIGHT_CODE
from OGGETTO_ORGANIZZATIVO l left outer join
ANAG_OGGETTO_ORGANIZZATIVO r on l.objectID = r.objectID
WHERE r.objectID IS NULL;
返回一些行,而另一个查询
select l.objectID LEFT_CODE
from OGGETTO_ORGANIZZATIVO l left outer join
ANAG_OGGETTO_ORGANIZZATIVO r on l.objectID = r.objectID
WHERE r.objectID IS NULL;
不返回任何内容。
我的问题是在右表中插入左表中的所有行,而不是右表中的所有行;目前,右边的桌子是空的
似乎如果我没有在select子句中引用正确的字段,oracle将不会管理外部联接
提前谢谢。
保罗
[更新]
第一个问题
执行计划
第二个问题
执行计划
第一个执行计划语句(NULL不是NULL)
在我看来很奇怪
[第二次更新]
@不是,
但为什么会这样呢
CREATE TABLE LEFT_TBL
( "OBJECTID" VARCHAR2(20 BYTE) ) ;
CREATE TABLE RIGHT_TBL
( "OBJECTID" VARCHAR2(20 BYTE) ) ;
INSERT ALL
INTO LEFT_TBL (OBJECTID) VALUES ('AAA')
INTO LEFT_TBL (OBJECTID) VALUES ('BBB')
INTO LEFT_TBL (OBJECTID) VALUES ('CCC')
SELECT * from DUAL;
SELECT l.objectID
FROM LEFT_TBL l LEFT OUTER JOIN RIGHT_TBL r
ON L.OBJECTID = r.OBJECTID
WHERE r.OBJECTID IS NULL;
这是一个执行计划吗
Plan hash value: 2059691840
--------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 3 | 72 | 5 (0)| 00:00:01 |
|* 1 | HASH JOIN ANTI | | 3 | 72 | 5 (0)| 00:00:01 |
| 2 | TABLE ACCESS FULL| LEFT_TBL | 3 | 36 | 3 (0)| 00:00:01 |
| 3 | TABLE ACCESS FULL| RIGHT_TBL | 1 | 12 | 2 (0)| 00:00:01 |
--------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - access("L"."OBJECTID"="R"."OBJECTID")
Note
-----
- dynamic sampling used for this statement (level=2)
可能是和索引问题?您发布的解释计划可能与实际执行计划不同。
不同之处在于解释计划正是优化器(CBO)认为在查询的实际执行过程中它将遵循的,这可能会偏离实际的执行计划
话虽如此,如果你的解释计划是可信的,那么这显然是一个优化器缺陷,正如我在评论中假设的那样。
由于某些原因,在第一次查询中,CBO采用了不正确的快捷方式,并忽略了左外部
联接(根本不访问右表)并使用奇怪的NULL is NOT NULL
谓词作为最终筛选器,该筛选器始终为FALSE
,这意味着您的最终结果集始终为空
要解决此问题,您可能需要向Oracle支持部门提出问题,并修补数据库以修复此错误
编辑:如果两个表上的统计信息都已过期,请收集两个表上的统计信息,然后尝试重新运行查询。CBO可能会在收集统计数据后采取正确的计划。然而,统计数据过时仍然不是国会预算办公室选择错误执行计划的借口。您可能希望在向Oracle支持部门提交通知单后执行此操作,以便在他们处理此错误时,此错误行为仍然可以重现。错误10269193-外部联接和案例表达式优化(案例不需要存在)或类似运算符(文档ID 10269193.8)的错误结果 产品(组件) Oracle服务器(Rdbms) 据信受影响的版本范围 版本>=11.2但低于12.1 症状: 有关:
- 可能发生内部错误(ORA-600)
- 错误的结果
- ORA-600[kkfdjoi:kkfdnpart_DIM1]
CREATE TABLE LEFT_TBL
( "OBJECTID" VARCHAR2(20 BYTE) ) ;
CREATE TABLE RIGHT_TBL
( "OBJECTID" VARCHAR2(20 BYTE) ) ;
INSERT ALL
INTO LEFT_TBL (OBJECTID) VALUES ('AAA')
INTO LEFT_TBL (OBJECTID) VALUES ('BBB')
INTO LEFT_TBL (OBJECTID) VALUES ('CCC')
SELECT * from DUAL;
SELECT l.objectID
FROM LEFT_TBL l LEFT OUTER JOIN RIGHT_TBL r
ON L.OBJECTID = r.OBJECTID
WHERE r.OBJECTID IS NULL;
Plan hash value: 2059691840
--------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 3 | 72 | 5 (0)| 00:00:01 |
|* 1 | HASH JOIN ANTI | | 3 | 72 | 5 (0)| 00:00:01 |
| 2 | TABLE ACCESS FULL| LEFT_TBL | 3 | 36 | 3 (0)| 00:00:01 |
| 3 | TABLE ACCESS FULL| RIGHT_TBL | 1 | 12 | 2 (0)| 00:00:01 |
--------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - access("L"."OBJECTID"="R"."OBJECTID")
Note
-----
- dynamic sampling used for this statement (level=2)