日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Oracle学习笔记:a inner join b与from a,b where a.x=b.x的差异

發布時間:2024/10/12 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Oracle学习笔记:a inner join b与from a,b where a.x=b.x的差异 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

  近期,在使用Oracle的過程中,由以下兩段代碼的執行引發的思考,到底 select * from a,b where a.id = b.idselect * from a inner join b on a.id = b.id 有沒有區別?

----- 代碼1 ---- select a.xxx, b.xxx, c.xxx from BUSI_SQJS a,BUSI_SLSH b,BUSI_XSSC c,BUSI_SCJD d,BUSI_ZJQF e,BUSI_ZJBFSD f where substr(a.HANDLERDAVARTE,1,10) between '2018-01-01' and '2018-11-14' and a.PROCESS_NUM=b.PROCESS_NUM and a.PROCESS_NUM=c.PROCESS_NUM and a.PROCESS_NUM=d.PROCESS_NUM and a.PROCESS_NUM=e.PROCESS_NUM and a.PROCESS_NUM=f.PROCESS_NUM;---- 代碼2 ---- select /*+parallel(a,10)*/ a.SQRLX,a.SQRMC,a.SQRSFZMWJ,a.CARDID,a.SQRLXDH,a.SQRLXDZ,a.SDFS,a.SQJSYJ,a.HAS_SPCL,a.HAS_CLBZ,e.ZJBH,f.SDFS,a.SQJSJG,b.SQSLJG,c.SQCLXSSCJG,d.SCJDSCJG from BUSI_SQJS a left join BUSI_SLSH b on a.PROCESS_NUM=b.PROCESS_NUM left join BUSI_XSSC c on a.PROCESS_NUM=c.PROCESS_NUM left join BUSI_SCJD d on a.PROCESS_NUM=d.PROCESS_NUM left join BUSI_ZJQF e on a.PROCESS_NUM=e.PROCESS_NUM left join BUSI_ZJBFSD f on a.PROCESS_NUM=f.PROCESS_NUM where a.HANDLERDAVARTE >= to_date('2018-01-01','yyyymmdd') and a.HANDLERDAVARTE <= to_date('2018-11-14','yyyymmdd');

  經過好一番查資料驗證,最后更加迷惑。。。

  ……

  ……

  有一說法:inner join優于where多表查詢

  另一說法:where a,b 默認就是內連接 inner join

  join 方式的 on 指向連接條件,而其后的 where 條件是篩選連接條件產生的結果集,即先按連接條件連接兩表,后根據條件進行篩選。

  inner join 與一般笛卡爾積的區別:inner join是笛卡爾積的特殊形式。如果有表a和表b,表a有m條記錄,表b有n條記錄,則一般笛卡爾積后得到的記錄條數是m*n條,記錄之間的組合是隨意的。而內連接則是建立在表a和表b的結構中有相同的列名的基礎上進行的。

  單純的select * from a,b是笛卡爾乘積。

  但是,如果對兩個表進行關聯:select * from a,b where a.id = b.id 就變了,此時就等價于:select * from a inner join b on a.id = b.id,即內連接。

  ……

  ……

  最后,不得已,還是得親自動手實驗。。。

select * from temp_cwh_1128 -- 1275188 select * from mobile.tb_mr_prod_obj@recom -- 1274 ---- 1.建立測試表 ---- create table temp_cwh_1128 as select * from table_xxx a where a.target_id='764' ---- 2.inner join 測試 ---- 4s select b.prod_code, count(distinct a.account_id) from temp_cwh_1128 a inner join mobile.tb_mr_prod_obj@recom b on a.prod_id = b.prod_id group by b.prod_code order by b.prod_code; ---- 3.多表連接測試 ---- 4s select b.prod_code, count(distinct a.account_id) from temp_cwh_1128 a, mobile.tb_mr_prod_obj@recom b where a.prod_id = b.prod_id group by b.prod_code order by b.prod_code;

  查看解釋計劃,兩種測試方式的執行過程應該是一致的。

  結論來了!!!

  1.等值連接,不加where條件的時候會產生笛卡爾積,尤其是多表進行連接的時候,產生的笛卡爾積不可預料;但是加上條件a.id = b.id之后,與內連接inner join的效率是一樣的,所以“代碼1”中的方式理論上來說并沒有什么問題;

  2.內連接本質上也是將多表關聯之后,篩選滿足條件的行;

  3.where a,b的寫法不符合規范,最好寫成inner join的寫法。


END?2018-11-29?16:44:49

轉載于:https://www.cnblogs.com/hider/p/10039089.html

總結

以上是生活随笔為你收集整理的Oracle学习笔记:a inner join b与from a,b where a.x=b.x的差异的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。