oracle中或者or和左连接left join 怎么一起使用????

问题描述

oracle中或者or和左连接left join 怎么一起使用????

语句
select a.owner_id,count(b1.ship_id) cnt,nvl(sum(b1.dwt),0) dwt
from so_shipowner_info a left join order_info_secondhand_formal b1
on b1.ship_business_date>to_char(sysdate,'yyyy') and (b1.buyer_id=a.owner_id or b1.sellers_id=a.owner_id)
group by a.owner_id
表b1中有卖家sellers_id,买家buyer_id ,表a中有用户owner_id,
逻辑是:输出用户id,b1数量 cnt,b1吨数 dwt,当b1交易时间大于今年年初而且买家id=用户id或者卖家id=用户id,
以a表为基表,进行左连接,但是这个语句执行很慢,想改为(+)和where 条件的,or和(+)不能一起使用.哪位大神有办法????

解决方案

oracle的+其实就是 left/right join on语句。没有区别。

因为有or语句,所以索引在一定程度上就起不到作用了,走的基本都是全表。 建议可以结合实际业务做优化:

1、把or部分拆开,用两条查询语句代替,然后做union, 这样话加上索引的话应该改会比当前语句要快
2、如果一次取出的数据不是很多,可以考虑在内存中进行数据整理。也就是简化SQL,查询出来数据在内容在做过滤。

如果以上你都不喜欢,还是希望优化你的SQL,那还是执行下查询计划,看下慢在那里了,根据实际情况该加索引加索引,该优化SQL优化SQL,只查询计划展示的结果让你满意为止!

解决方案二:

sql 左连接和右连接的使用技巧(left join and right join)
8.2.1.9 LEFT JOIN and RIGHT JOIN Optimization 左连接和右连接优化:
oracle中left join中on和where的区别

时间: 2024-08-23 18:08:13

oracle中或者or和左连接left join 怎么一起使用????的相关文章

数据库中的左连接(left join)和右连接(right join)区别_数据库其它

Left Join / Right Join /inner join相关 关于左连接和右连接总结性的一句话: 左连接 where只影向右表,右连接where只影响左表. Left Join select * from tbl1 Left Join tbl2 where tbl1.ID = tbl2.ID 左连接后的检索结果是显示tbl1的所有数据和tbl2 中满足where 条件的数据. 简言之 Left Join影响到的是右边的表 Right Join select * from tbl1 R

数据库中的左连接(left join)和右连接(right join)区别

Left Join / Right Join /inner join相关 关于左连接和右连接总结性的一句话: 左连接where只影向右表,右连接where只影响左表. Left Join select * from tbl1 Left Join tbl2 where tbl1.ID = tbl2.ID 左连接后的检索结果是显示tbl1的所有数据和tbl2中满足where 条件的数据. 简言之 Left Join影响到的是右边的表 Right Join select * from tbl1 Rig

两个sql查询语句之间的左连接left join

代码如下: 子查询内部也使用了左连接 select a.id, a.thumbNail,a.name,a.marketPrice,a.memberPrice ,a.personName,a.status,a.recieveOrderDate,a.trackNumber,a.contact,a.reportSendDate,b.trackNumber,a.reportDownloadPath from  (select od.id, ps.thumbNail,ps.name,od.marketPr

MySQL left join 左连接详解介绍

表a 1 aid adate   2 1 a1   3 2 a2   4 3 a3 表b 1 bid bdate   2 1 b1   3 2 b2   4 4 b4 1  代码如下 复制代码 select * from a left join b on a.aid = b.bid 首先取出a表中所有数据,然后再加上与a.b匹配的的数据. 此时的取出的是: 1 1 a1 b1   2 2 a2 b2   3 3 a3 空字符 同样的也有right join 指的是首先取出b表中所有数据,然后再加

MySQL连接left join,right join,inner join语句用法

在讲MySQL的Join语法前还是先回顾一下联结的语法,呵呵,其实连我自己都忘得差不多了,那就大家一起温习吧(如果内容有错误或有疑问,国内关于MySQL联结查询的资料十分少,相信大家在看了本文后会对MySQL联结语法有相当清晰的了解,也不会被Oracle的外联结的("+"号)弄得糊涂了. 在SQL标准中规划的(Join)联结大致分为下面四种: php开源嘛 1. 内联结:将两个表中存在联结关系的字段符合联结关系的那些记录形成记录集的联结. 2. 外联结:分为外左联结和外右联结. php

Oracle的左连接和右连接

oracle 在Oracle PL-SQL中,左连接和右连接以如下方式来实现 查看如下语句:SELECT emp_name, dept_name FORM Employee, DepartmentWHERE Employee.emp_deptid(+) = Department.deptid此SQL文使用了右连接,即"(+)"所在位置的另一侧为连接的方向,右连接说明等号右侧的所有记录均会被显示,无论其在左侧是否得到匹配,也就是说上例中无论会不会出现某个部门没有一个员工的情况,这个部门的

mysql中关于左连接,取出来的数据顺序和主表不一样

问题描述 mysql中关于左连接,取出来的数据顺序和主表不一样 如题,楼主最近在跟着视频学习SQL语句,发送自己做出来的效果和老师不一样 如图 这时两张表,学生表和班级表 要求是查询班级一样的学生信息,查出左连接显示是这样的: 右连接显示这样 请问一下为什么左连接查询出来显示数据的顺序不是按照学生表的顺序来啊?学生表不是主表么?为什么我显示出来的itcast顺序完全乱了,而是按照后面右表的id顺序来排? 求求求,急求大神解疑 解决方案 这个结果就是这样的.因为你的左连接写的是pr_student

Oracle中三种表连接算法的总结

Oracle有三种表连接技术,分别是嵌套连接.合并连接和哈希连接.以下就是对这三种表连接算法进行了详细的分析介绍,需要的朋友可以参考下   1. 嵌套循环连接 (NESTED LOOP Join)嵌套连接把要处理的数据集分为外循环(驱动数据源)和内循环(被驱动数据源),外循环只执行一次(先执行),内循环执行的次数等于外循环执行的数据集个数. 这种连接的好处是内存使用非常少. 如果驱动数据源有限,且被驱动表在连接列上有相应的索引,则这种连接方式才是高效的. 在OLTP系统上常见到这种连接方式. 2

Oracle中删除用户和表空间的常见问题(比如:ORA-01940无法删除当前已连接用户的解决方案)

这时候以管理员身份进入sqlplus命令窗口. 在删除用户的时候有时候会出现以下问题: ORA-01940无法删除当前已连接用户 这时候的解决方案是: 1)查看用户的连接状况   select username,sid,serial# from v$session (2)找到要删除用户的sid,和serial,并删除 例如:你要删除用户'WUZHQ',可以这样做: alter system kill session'532,4562'; 这里的532表示的是sid,4562表示的是seria.