Oracle中Left join的on和where的效率差别
假设有两个表a、b
使用on
Select * from a left join b on b.col = a.col and b.col2 = ‘aa’
使用 where
Select * from a left join b on b.col = a.col where b.col2 = ‘aa’ and b.col2 is null
// b.col2 is null作用是防止因b表中没有匹配数据,照成a表原有记录无法返回的问题
分析
1、on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。
2、where条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有left join的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉。
语句测试
set serveroutput on ; -- 必须运行,否则打印结果无法显示
declare
I Number;
Starttime Timestamp;
Endtime Timestamp;
Begin
select current_timestamp(5) into starttime from Dual;
I := 1;
While I<=10000 Loop
dbms_output.put_line(i);
Execute Immediate ' '; --此处放入sql语句
i := i+1;
End Loop;
Select Current_Timestamp(5) Into Endtime From Dual;
dbms_output.put_line('10000条语句运行时间为(毫秒):' || (endtime - starttime)); --打印一个Interval类型数据,显示时间差
end;
测试结果
On语句, 10000条语句运行时间为(毫秒):+000000000 00:00:01.032850000
Where 语句 10000条语句运行时间为(毫秒):+000000000 00:00:01.013420000
结论
Where语句的性能优于on语句
其实sql语句的运行效率也可以通过查询oracle的系统视图来查看,但时间关系今后再研究了。
附
在C#中使用linq进行查询
// 写得比较仓促,见谅了
var reList = from DataRow a in dtA.Rows
join DataRow b in dtB.Rows on
new {t = a["col"], l=’aa’}
equals
new {t = b["col"], l = b["col2"] }
into rightRow from rw in rightRow.DefaultIfEmpty()
select new
{
Col1 = a["col"],
Col2 = rw["col2"]
};
在linq中使用into rightRow from rw in rightRow.DefaultIfEmpty()可以保证查询类型left outer join的效果,如果left join中有多个查询条件,使用new两个对象进行比较即可。
Oracle中Left join的on和where的效率差别的更多相关文章
- oracle中left join,right join,inner join的坑
本文主要是记录一下实际使用oracle中join查询遇到的坑 1.用到两张表,学生表和学年分数表,先建立 2.普通连接查询 INNER JOIN,查询每个学年有成绩的学生以及分数情况 LFET JOI ...
- Oracle中Inner join和Where的区别
1 .Where子句中使用的连接语句,在数据库语言中,被称为隐性连接.Inner join--on子句产生的连接称为显性连接.(其他Join参数也是显性连接)Where 和Inner join产生的连 ...
- Oracle中left join、right join、full join应用场景
一.提出问题:三个表分别存不同属性,一条sql查询各个公司的不同的属性 (1) 提供的三个表,相同的维度[company] (2) 需要的结果: 二.问题解析:可通过先查出所有公司再左连接三个表,或者 ...
- oracle 中的select ...connect by prior ...start with 及(+)的用法
1.select ...connect by prior ...start with的用法: select ... from <tablename> where <condition ...
- oracle使用LEFT JOIN关联产生的问题在查询结果中使用CASE WHEN 无法判断
oracle使用LEFT JOIN关联产生的问题在查询结果中使用CASE WHEN 无法判断 查询方式一: SELECT CASE WHEN (SELECT CAST(SUM(CASE ) THEN ...
- Oracle中join left,join right,inner join,(+) 等
Oracle中join left,join right,inner join,(+) 等 博客分类: Oracle 建表create table TEST1create table TEST1( ...
- Oracle中 (+)与left join 的用法区别
Oracle中 (+)与left join 的用法区别 原创 2017年01月11日 13:33:42 6648 select * from a,b where a.id=b.id(+); (+)写在 ...
- oracle中临时表是用来做什么的
oracle中临时表是用来做什么的 某些情况下, 需要 多个非常大的表关联的情况下, 但是需要检索的, 是少量的数据的时候.可以先把 大表的数据, 检索出那一小部分, 然后插入到 临时表中, 最后再关 ...
- 《oracle每天一练》Merge Into 语句代替Insert/Update在Oracle中的应用实战
转载自窃破天道 动机: 想在Oracle中用一条SQL语句直接进行Insert/Update的操作. 说明: 在进行SQL语句编写时,我们经常会遇到大量的同时进行Insert/Update的语句 ,也 ...
随机推荐
- C# 之 user32函数库
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.R ...
- 1.4.1.Documents,Fields和Schema概述
Documents,Fields和Schema概述 solr的基本前提是非常简单,你可以给它很多信息,然后可以向它提出问题,获取你想要的问题的信息.所有信息输入的地方就叫做索引或者更新.当你提出问题时 ...
- NSBlockOperation添加多个任务
//创建一个队列 NSOperationQueue *operation=[[NSOperationQueue alloc]init]; //把任务放在NSBlockOperation里面 NSBlo ...
- 源自梦想 eclipse快捷键整理
Ctrl+1 快速修复(最经典的快捷键,就不用多说了) Ctrl+D: 删除当前行 Ctrl+Alt+↓ 复制当前行到下一行(复制增加) Ctrl+Alt+↑ 复制当前行到上一行(复制增加) ...
- Uva 10305 - Ordering Tasks 拓扑排序基础水题 队列和dfs实现
今天刚学的拓扑排序,大概搞懂后发现这题是赤裸裸的水题. 于是按自己想法敲了一遍,用queue做的,也就是Kahn算法,复杂度o(V+E),调完交上去,WA了... 于是检查了一遍又交了一发,还是WA. ...
- QQ互联登陆出现(1054) Unknown column “conuintoken” in “field list”
在dz论坛中打开了QQ互联登录功能之后提示(1054) Unknown column conuintoken in field list 错误 我们看到sql 错误就是说没有conuintoken字了 ...
- springmvc的一个小例子学习(一)
个人觉得,学框架最好的 方法无外乎两个:一个是实践这个框架,真实的去用它,比如spring框架,先搭一个简单的spring项目,然后一步一步得去丰富它,从中学到spring框架的精髓和知识:另外一个就 ...
- 百度编辑器UEditor,地址栏传值长度有限-在webConfig配置
<system.web> <httpRuntime requestValidationMode=" ></httpRuntime> <compila ...
- 运用DataTable进行行转列操作
public DataTable GetReverseTable(DataTable p_Table) { DataTable _Table = new DataTable(); ; i != p_T ...
- Swiper之初识
何为Swiper?Swiper是一款免费以及轻量级的移动设备触控滑块的框架,使用硬件加速过渡(如果该设备支持的话).主要使用与移动端的网站.网页应用程序(web apps),以及原生的应用程序(nat ...