gpt4 book ai didi

sql - ORACLE 左外连接问题(空表?)

转载 作者:行者123 更新时间:2023-12-01 05:09:09 25 4
gpt4 key购买 nike

我想知道为什么这个查询:

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 将不会管理外连接。

提前致谢。
保罗

[更新]
第一个查询
select l.codice_oggetto_SAP
from oggetto_organizzativo l left outer join
ANAG_OGGETTO_ORGANIZZATIVO_SAP r
ON l.codice_oggetto_sap = r.codice_oggetto_SAP
WHERE r.codice_oggetto_sap is null

执行计划
enter image description here

第二次查询
select l.codice_oggetto_SAP, r.codice_oggetto_SAP
from oggetto_organizzativo l left outer join
ANAG_OGGETTO_ORGANIZZATIVO_SAP r
ON l.codice_oggetto_sap = r.codice_oggetto_SAP
WHERE r.codice_oggetto_sap is null

执行计划
enter image description here

第一条执行计划语句 (NULL IS NOT NULL)在我看来很好奇...

[第二次更新]
@toddlermenot,

但为什么这有效???:
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)

会不会是和Index的问题?

最佳答案

您发布了可能与实际执行计划不同的解释计划。
不同之处在于解释计划正是优化器 (CBO) 认为它在查询的实际执行期间可能会偏离实际执行计划时所遵循的。

话虽如此,如果你的解释计划可信,那么这肯定是一个 优化器错误 正如我在评论中假设的那样。
出于某种原因,在您的第一个查询中,CBO 使用了错误的快捷方式并忽略了 LEFT OUTER join(根本没有访问正确的表)并使用奇怪的 NULL is NOT NULL谓词作为最终过滤器,它始终是 FALSE这意味着您的最终结果集始终为空。

要解决此问题,您可能需要向 Oracle 支持部门提出请求并修补您的数据库以修复此错误。

编辑:如果两个表的统计信息都已过期,请收集两个表的统计信息并尝试重新运行查询。收集统计数据后,CBO 可能会采取正确的计划。然而,过时的统计数据仍然不是 CBO 选择错误执行计划的借口。您可能希望在向 Oracle Support 提出请求后执行此操作,以便在他们处理此错误时仍然可以重现这种不正确的行为。

关于sql - ORACLE 左外连接问题(空表?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26262254/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com