如何减少oracle inner使用inner join时所使用的时间?

数据库(21)
& & & 一、oracle中left join和right join的区别&&
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:11817次
排名:千里之外
原创:55篇
技术交流QQ群:
(1)(2)(2)(1)(6)(9)(30)(10)查看: 6624|回复: 3
inner join和where的效率比较
论坛徽章:2
a inner join b 和 from a,b,在使用方式和效率上有何区别?
论坛徽章:1088
如果你的where无+
我想没有区别,oracle会把他们最终转换成一样的东西
论坛徽章:86
优化器会自动转换,转换以后一样的。
论坛徽章:0
之前我也一直这样认为,但在实际的查询实现是,差距很大,从执行计划看inner join ... on 要比a,b where 这种快很多,不知道那位高人指点一下
itpub.net All Right Reserved. 北京皓辰网域网络信息技术有限公司版权所有    
 北京市公安局海淀分局网监中心备案编号: 广播电视节目制作经营许可证:编号(京)字第1149号oracle 内连接(inner join)、外连接(outer join)、全连接(fu...
oracle 内连接(inner join)、外连接(outer join)、全连接(fu...
建表语句:
create table EMPLOYEE(& EID&&& NUMBER,& DEPTID NUMBER,& ENAME& VARCHAR2(200))
create table DEPT(& DEPTID&& NUMBER,& DEPTNAME VARCHAR2(200))
oracle中的连接可分为,内连接(inner join)、外连接(outer join)、全连接(full join),不光是Oracle,其他很多的数据库也都有这3种连接查询方式
一、内连接inner join,这是我们经常用的查询方式,比如select * from A inner join B on A.field1=B.field2,个人认为,这样的内连接查询与下面的查询等效,select * from A,B where A.field1=B.field2,内连接查询只能查询出匹配的记录,匹配不上的记录时无法查询出来的 。
select * from dept inner join employee on dept.deptid=employee.deptid
select * from dept , employee where dept.deptid=employee.deptid
二、外连接outer join,可进一步分为左外连接left outer join和右外连接right outer join,具体说一下左外连接和右外连接查询的特点,有2个表,部门表和职工表,一个部门下可以有多个职工,一个职工只能对应一个部门,所以部门和职工时1对多的关系,设计表如下
比如现在有需求1,要进行部门表和职工表的关联查询,并要查询出所有的部门信息,这时候,下面的左连接查询就能够查询出想要的结果,左连接就是以left join前面的表为主表,即使有些记录关联不上,主表的信息能够查询出来的
select * from dept left outer join employee on dept.deptid=employee.deptid
比如现在有需求2,要进行部门表和职工表的关联查询,并要查询出所有的职工信息,这时候,下面的右连接查询就能够查询出想要的结果,右连接就是以right join后面的表为主表,即使有些记录关联不上,主表的信息能够查询出来
select * from dept right outer join employee on dept.deptid=employee.deptid
在介绍另外的一种写法,同样达到外连接的效果,大家可以尝试使用。比如在需求1中,下面的查询语句与需求1中给出的左连接语句等效!
select * from dept ,employee where dept.deptid=employee.deptid(+)&
总之,外连接就是在关联不上的时候,把其中的部分信息查询出来
三、全连接full join,语法为full join ... on ...,全连接的查询结果是左外连接和右外连接查询结果的并集,即使一些记录关联不上,也能够把部分信息查询出来
select * from dept full join& employee on dept.deptid=employee.deptid
select * from dept full join& employee on 1=1
发表评论:
TA的最新馆藏[转]&[转]&[转]&[转]&1735人阅读
Oracle 开发(124)
Select bu.f_Comechannel,Count(Distinct x.f_username) x ,Sum(bs.f_Paymoney) pmoney
From T_BASE_USER_FIRST_TRADE_LOTTY x
Inner Join t_Base_Userinfo bu On&& bu.f_Username = x.f_username
Inner Join t_Base_Succprouser bs On bs.f_Username = x.f_username
Where x.f_lotid IN (9)
And bs.f_lotid IN (9)
And x.f_tradetime Between to_date('','yyyy-mm-dd') And to_date('','yyyy-mm-dd')
And bs.f_Expectenddate Between to_date('','yyyy-mm-dd') And to_date('','yyyy-mm-dd')
Group By bu.f_Comechannel
SELECT COUNT (distinct b.f_username) num, SUM (b.f_paymoney) allmoney
& FROM t_base_succprouser b
&WHERE b.f_lotid IN (9)
&& AND b.f_username IN
&&&&&&&&& SELECT c.f_username
&&&&&&&&&&& FROM t_base_user_first_trade_lotty c
&&&&&&&&&& WHERE c.f_tradetime BETWEEN TO_DATE ('-00:00:00', 'YYYY/MM/DD-HH24:MI:SS')
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& AND TO_DATE ('-00:00:00','YYYY/MM/DD-HH24:MI:SS' )
&&&&&&&&&&&& AND c.f_lotid IN (9)
&&& &&& &&& &&& &&& &&& &)
&& AND b.f_expectenddate BETWEEN TO_DATE ('-00:00:00''YYYY/MM/DD-HH24:MI:SS' )
&&&&&&&&&&&&&&&&&&&&&&&&&&&& AND TO_DATE ('-00:00:00', 'YYYY/MM/DD-HH24:MI:SS')
人数和金额一样
当是以下就不一样了
SELECT COUNT (distinct b.f_username) num, SUM (b.f_paymoney) allmoney
& FROM t_base_succprouser b
&WHERE b.f_lotid IN (1, 15, 17, 10000)
&& AND b.f_username IN
&&&&&&&&& SELECT c.f_username
&&&&&&&&&&& FROM t_base_user_first_trade_lotty c
&&&&&&&&&& WHERE c.f_tradetime BETWEEN TO_DATE ('-00:00:00', 'YYYY/MM/DD-HH24:MI:SS')
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& AND TO_DATE ('-00:00:00','YYYY/MM/DD-HH24:MI:SS' )
&&&&&&&&&&&& AND c.f_lotid IN (1, 15, 17, 10000)
&&& &&& &&& &&& &&& &&& &)
&& AND b.f_expectenddate BETWEEN TO_DATE ('-00:00:00''YYYY/MM/DD-HH24:MI:SS' )
&&&&&&&&&&&&&&&&&&&&&&&&&&&& AND TO_DATE ('-00:00:00', 'YYYY/MM/DD-HH24:MI:SS')
Select bu.f_Comechannel,Count(Distinct x.f_username) x ,Sum(bs.f_Paymoney) pmoney
From T_BASE_USER_FIRST_TRADE_LOTTY x
Inner Join t_Base_Userinfo bu On&& bu.f_Username = x.f_username
Inner Join t_Base_Succprouser bs On bs.f_Username = x.f_username
Where x.f_lotid IN& (1, 15, 17, 10000)
And bs.f_lotid IN
(1, 15, 17, 10000)
And x.f_tradetime Between to_date('','yyyy-mm-dd') And to_date('','yyyy-mm-dd')
And bs.f_Expectenddate Between to_date('','yyyy-mm-dd') And to_date('','yyyy-mm-dd')
Group By bu.f_Comechannel
人数一样,金额差别很多!统计的表一样,时间条件一样,ID也一样,上面语句产生同样的结构,为什么多增加几个ID就不一样呢?
为什么呢?因为根据f_username 连接&
&USERNAME&& &ID&& &MONEY&& &USERNAME&& &ID&& &MONEY
1&& &a&& &17&& &700&& &a&& &1&& &200
2&& &a&& &15&& &600&& &a&& &1&& &200
3&& &a&& &1&& &500&& &a&& &1&& &200
4&& &a&& &17&& &700&& &a&& &15&& &300
5&& &a&& &15&& &600&& &a&& &15&& &300
6&& &a&& &1&& &500&& &a&& &15&& &300
7&& &a&& &17&& &700&& &a&& &17&& &400
8&& &a&& &15&& &600&& &a&& &17&& &400
9&& &a&& &1&& &500&& &a&& &17&& &400
10&& &b&& &15&& &200&& &b&& &1&& &400
11&& &b&& &1&& &100&& &b&& &1&& &400
12&& &b&& &15&& &200&& &b&& &15&& &400
13&& &b&& &1&& &100&& &b&& &15&& &400
&& bu.f_Comechannel,Count(Distinct bs.f_username) x ,Sum(bs.f_Paymoney) pmoney
From t_Base_Succprouser bs
Inner Join t_Base_Userinfo bu On&& bu.f_Username = bs.f_username
Where bs.f_lotid IN (1, 15, 17, 10000)
And bs.f_Expectenddate Between to_date('','yyyy-mm-dd') And to_date('','yyyy-mm-dd')
And bs.f_username In(
&&&&&&& SELECT c.f_username
&&&&&&&&&&& FROM t_base_user_first_trade_lotty c
&&&&&&&&&& WHERE c.f_tradetime BETWEEN TO_DATE ('-00:00:00', 'YYYY/MM/DD-HH24:MI:SS')
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& AND TO_DATE ('-00:00:00','YYYY/MM/DD-HH24:MI:SS' )
&&&&&&&&&&&& AND c.f_lotid IN (1, 15, 17, 10000)
&&& &&& &&& &&& &&& &&& &)
Group By bu.f_Comechannel
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:1186597次
积分:15266
积分:15266
排名:第516名
原创:299篇
转载:166篇
评论:252条

我要回帖

更多关于 inner join 的文章

 

随机推荐