大橙子网站建设,新征程启航
为企业提供网站建设、域名注册、服务器等服务
尽量用标准SQL语法来写,这样一是代码清晰,二是外联接无误。 SELECT ...FROM TableMaster MLEFT JOIN TableJoin J ON M.xx = J.xxLEFT JOIN TableJoin2 J2 ON M.xx = J2.xx
创新互联建站总部坐落于成都市区,致力网站建设服务有网站设计制作、成都网站建设、网络营销策划、网页设计、网站维护、公众号搭建、微信小程序、软件开发等为企业提供一整套的信息化建设解决方案。创造真正意义上的网站建设,为互联网品牌在互动行销领域创造价值而不懈努力!
WITH TELLER_ACCOUNT_MAIN AS(SELECT 1 teller_by,to_date('2018-05-01 13:23:55','yyyy-mm-dd hh24:mi:ss')update_time,500 total_mount FROM dual
UNION ALL SELECT 1 teller_by,to_date('2018-05-02 16:20:10','yyyy-mm-dd hh24:mi:ss'),777 total_mount FROM dual
)
,SYS_USER AS (SELECT 1 teller_by,'张三'NAME FROM dual
UNION ALL SELECT 2 teller_by,'李四'NAME FROM dual
)
--上面是虚拟的数据 ,因为我没有你的表
SELECT A.*,nvl(B.total_mount,0)total_mount FROM SYS_USER A LEFT JOIN (SELECT t.*
,row_number() OVER (PARTITION BY teller_by ORDER BY update_time DESC)rn
FROM TELLER_ACCOUNT_MAIN t)B ON A.teller_by=B.teller_by AND B.rn=1;
跟my sql一样的关联,这些关联查询都是一样的,例如内联查询,左联查询
内联查询:
想把用户的积分信息, 等级,都列出来,一般会出现:
select * from emd_mteller t1,emd_mrole t2 where t1.teller_id = t2.teller_id
select * from emd_mteller t1 inner join emd_mrole t2 on t1.teller_id = t2.teller_id
左联查询:
left join 或者left outer join
返回左表中的所有行。如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值(null)。
Select * from t1 left outer join t3 on t1.userid = t2.userid
(+) 和 left join是一个意思,不同年代的sql标准而已
你这个慢的原因在于join的条件里面有or操作,肯定会比较慢
给你个建议:
把or拆成2段sql 然后union all起来,通过主键滤重下就不会重复取值了
(+)就是连接
譬如
SELECT a.*, b.* from a(+) = b就是一个右连接,等同于select a.*, b.* from a right join b
SELECT a.*, b.* from a = b(+)就是一个左连接,等同于select a.*, b.* from a left join b
即" (+)"所在位置的另一侧为连接的方向,通常将全量集合与部分集合连接时,在部分集合的列后面带上(+),以达到没有匹配时,也要显示出一个null的效果
明白了么?