Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql ORACLE左外部联接问题(表为空?)_Sql_Oracle - Fatal编程技术网

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]

您描述的行为可能是一个bug。你能在SQL Fiddle上复制它吗?哪一版本的Oracle?但是直觉。。Oracle不会犯此错误。。至少在Oracle 11g中,它可以正常工作。。有趣。这可能是CBO走了不该走的捷径导致的错误吗?。您可以发布这两个查询的执行计划吗?@joe:Oracle数据库11g企业版11.2.0.4.0-64位Production@PaoloUrsini:您似乎正在使用SQL Developer工具,该选项卡在屏幕截图中显示为“解释计划”。获取实际执行计划有多种方法:一种常见的方法是使用dbms\u xplan.display\u cursor->。首先,非常感谢!我用第二种情况更新了这篇文章,类似于给我这个问题的情况,但这确实有效!!!也许这真的是一个统计问题:-(我会让我的DBA感兴趣,再次向Oracle支持部门表示感谢。非常欢迎。我必须同意您的观点,即此问题是针对您的情况的,不能在一组新的表(如Maheswaran Ravisankar的SQL Fiddle)中重现。这就是为什么我建议您仅在Oracle支持人员处理后收集统计数据。
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)