暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 联接表

askTom 2017-03-27
265

问题描述

嗨,

我正在尝试学习联接概念,下面是我提到的要学习的URL
https://docs.oracle.com/cd/F49540_01/DOC/server.815/a67781/c20c_joi.htm
因为我对外表、驾驶表和内表等术语感到困惑。我在谷歌上搜索了这个术语,然后我得到的结果是
在From子句中,左一个是外部,右一个是内部
来自EMP,部门这里EMP是外部的,另一个是内部的。我对此不满意,因为在嵌套循环中,连接emp是外部的,而在群集中,连接部门是外部的,所以请解释一下这些是什么?
提前谢谢。

专家解答

所以如果你有以下的查询和执行计划:

set serveroutput off
select * from hr.departments d
join   hr.employees e
on     d.department_id = e.department_id
where  d.department_id = 10;

select * from table(dbms_xplan.display_cursor(null, null, 'BASIC LAST'));

PLAN_TABLE_OUTPUT                                              
EXPLAINED SQL STATEMENT:                                       
------------------------                                       
select * from hr.departments d join   hr.employees e on        
d.department_id = e.department_id where  d.department_id = 10  
                                                               
Plan hash value: 3257916907                                    
                                                               
----------------------------------------------------------     
| Id  | Operation                    | Name              |     
----------------------------------------------------------     
|   0 | SELECT STATEMENT             |                   |     
|   1 |  NESTED LOOPS                |                   |     
|   2 |   TABLE ACCESS BY INDEX ROWID| DEPARTMENTS       |     
|   3 |    INDEX UNIQUE SCAN         | DEPT_ID_PK        |     
|   4 |   TABLE ACCESS BY INDEX ROWID| EMPLOYEES         |     
|   5 |    INDEX RANGE SCAN          | EMP_DEPARTMENT_IX |     
---------------------------------------------------------- 
复制


部门是计划中的第一个。因此,这是文档描述的 “外部” 或 “驱动” 表。数据库首先从部门读取行。对于其中的每一个,它都会在员工中查找与联接条件匹配的行。

但是,如果您将查询更改为针对员工的where子句,则计划会更改:

select * from hr.departments d
join   hr.employees e
on     d.department_id = e.department_id
where  e.employee_id = 100;

select * from table(dbms_xplan.display_cursor(null, null, 'BASIC LAST'));

PLAN_TABLE_OUTPUT                                             
EXPLAINED SQL STATEMENT:                                      
------------------------                                      
select * from hr.departments d join   hr.employees e on       
d.department_id = e.department_id where  e.employee_id = 100  
                                                              
Plan hash value: 2421983755                                   
                                                              
------------------------------------------------------        
| Id  | Operation                    | Name          |        
------------------------------------------------------        
|   0 | SELECT STATEMENT             |               |        
|   1 |  NESTED LOOPS                |               |        
|   2 |   TABLE ACCESS BY INDEX ROWID| EMPLOYEES     |        
|   3 |    INDEX UNIQUE SCAN         | EMP_EMP_ID_PK |        
|   4 |   TABLE ACCESS BY INDEX ROWID| DEPARTMENTS   |        
|   5 |    INDEX UNIQUE SCAN         | DEPT_ID_PK    |        
------------------------------------------------------ 
复制


员工现在是计划中的第一人。所以这是现在的驾驶表。

这是separate表在from子句中的显示方式以及您是否在其中指定了inner或outer join。

旁注: 这是您正在阅读的文档的古老版本。如果您想了解Oracle数据库,请使用更多最新信息:

http://docs.oracle.com/database/122/TGSQL/joins.htm#TGSQL95231
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论