1. 程式人生 > >Oracle中left join中右表的限制條件

Oracle中left join中右表的限制條件

無過濾條件的LEFT JOIN

SQL中最簡單形式的LEFT JOIN,是直接根據關聯欄位,以左表為基準,對右表進行匹配。在SELECT語句中選取的欄位,如果有右表的記錄(一般都是需要右表的某些記錄的),取出配對成功的右表記錄中對應的這個欄位的值;否則,直接置NULL。這本身就是LEFT JOIN的特點:保證左表記錄完整,右表只是輔助匹配。

直接看例子,為了演示,準備了兩張測試表test1,test2:

Sql程式碼  收藏程式碼
  1. select * from test1  

Sql程式碼  收藏程式碼
  1. select * from test2  

Sql程式碼  收藏程式碼
  1. select
     t2.*,t1.market_place_id from test2 t2   
  2. left join test1 t1  
  3. on t2.parent_asin=t1.asin  


 對照上面例子解釋一下這個結果:以左表test2為基準,用右表test1的asin欄位和test2的parent_asin欄位進行匹配,取出test2的全部資料和test1的market_place_id欄位。對於test2中的第一條記錄,因為右表中有兩條記錄符合的asin='parent1',只是market_place_id不同而已(分別為1、2)。於是這兩條記錄都會作為符合條件的記錄加入結果集。這時,雖然是以左表為基準,但是這條記錄卻在結果集中產生了兩條對應的記錄。這點要稍加註意:以左表為基準並不意味著結果集的記錄數量=左表的記錄數量!

再回過頭來看結果集的5條記錄,由ID欄位可以很好的區分出每條記錄是由左表的哪條記錄對應產生的。這裡,最後兩條記錄可以很好的體現出LEFT JOIN的特點。

右表有濾條件的LEFT JOIN

這裡,我們忽略左表有過濾條件場景的討論,因為在LEFT JOIN中左表作為基準表,對他的過濾直接反應在SQL的WHERE字句中,效果上也相當於單表SELECT的WHERE字句過濾,縮小左表範圍後,再和右表做JOIN,沒什麼懸念。

但是對於右表的過濾,通常有兩種主要的方式:在ON字句中加入過濾條件或者在LEFT JOIN之後的WHERE字句中加入過濾條件。對於這兩種方式的對比,下面主要針對邏輯語義和實現效能上加以對比。

  • 過濾條件在ON字句中
Sql程式碼  收藏程式碼
  1. select t2.*,t1.market_place_id from test2 t2   
  2. left join test1 t1  
  3. on t2.parent_asin=t1.asin and t1.market_place_id='2'  
 上面這條SQL加上了對右表test1中market_place_id的過濾條件:只關心market_place_id為‘2’的右表記錄。查詢結果如下。 



 

邏輯語義上,這個結果相當於右表test1首先進行了條件過濾,只剩下兩條記錄[(2,'parent1','2'),(3,'parent2','2')],然後左表test2和這個過濾之後的結果集進行無過濾條件的LEFT JOIN,於是得到了上圖的結果。

效能上,來看一下這條語句的執行計劃截圖

 可以看出,T1確實先以2為標準對market_place_id做了一次過濾,然後,在外層,再做原來的LEFT JOIN。由此可以證實上面邏輯語義結果的展示,同時也可以發現,就本例而言,如果能夠在market_place_id上建立index,可以直接避免內層過濾對右表進行的全表掃描,從而提高整個SQL的執行效率。下圖為在market_place_id上建立index之後,同樣SQL語句的執行計劃:

 這裡可以看出,原來的TABLE FULL SCAN 已經被換成了INDEX的RANGE SCAN,從而也直接導致了Oracle的優化器在最外層的Hash Join替換為了Nested Loops。(當然這個join的方式並不能說明什麼問題,因為畢竟測試用的資料集太小,完全有可能在大資料集的真實情況下,優化器根據統計資訊還是最終使用Hash Join演算法)

  • 過濾條件在WHERE子句中

相關推薦

Oracleleft join中右限制條件

無過濾條件的LEFT JOIN SQL中最簡單形式的LEFT JOIN,是直接根據關聯欄位,以左表為基準,對右表進行匹配。在SELECT語句中選取的欄位,如果有右表的記錄(一般都是需要右表的某些記錄的),取出配對成功的右表記錄中對應的這個欄位的值;否則,直接置NULL。這本身就是LEFT JOIN的特點

oracleleft join,right join,inner join的坑

本文主要是記錄一下實際使用oracle中join查詢遇到的坑 1.用到兩張表,學生表和學年分數表,先建立 2.普通連線查詢 INNER JOIN,查詢每個學年有成績的學生以及分數情況 LFET JOIN 和 RIGHT JOIN 也類似,不舉例了。   以下重點是說以下,連線的時

sqlleft join on 多個條件需要特殊注意之處

定義: LEFT JOIN 關鍵字會從左表 (table_name1) 那裡返回所有的行,即使在右表 (table_name2) 中沒有匹配的行。例如如下查詢: SELECT column_name(s) FROM table_name1 LEFT JOIN table_

oracleleft join 後的有些條件無效

Select * From (Select Rp.Module_Unique_Id, Rp.Part_No, Count(*) Over(Partition By Rp.Part_No) QtyFrom r_Wip_Panel Rp) qLeft Join c_Mod_Mod

LEFT JOIN關聯ON,WHERE後面跟條件的區別

前天寫SQL時本想通過 A left B join on and 後面的條件來使查出的兩條記錄變成一條,奈何發現還是有兩條。後來發現 join on and 不會過濾結果記錄條數,只會根據and後的條件是否顯示 B表的記錄,A表的記錄一定會顯示。不管and 後面的是A.id=

Oracleleft join使用子查詢( ORA-01799: 列不能外部聯接到子查詢)

informix改oracle遇到一個問題。注意:left join的第二張表,有多條資料,只取符合條件的一條(本例中取出actn_numb最大的一條記錄)。   基礎資料準備: create table A(     id number primar

Oracle使用join連線查詢代替 in和not in 查詢

首先,在oracle中效率排行:表連線>exist>not exist>in>not in,而且使用in查詢會有查詢條件數量不能超過1000的限制;因此如果簡單提高效率可以用exist代替in進行操作,當然換成表連線可以更快地提高效率,具體是用le

Oracleleft joinon和where的區別以及與(+)的區別

資料庫在通過連線兩張或多張表來返回記錄時,都會生成一張中間的臨時表,然後再將這張臨時表返回給使用者。       在使用left jion時,on和where條件的區別如下: 1、 on條件是在生成臨時表時使用的條件,它不管on中的條件是否為真,都會返回左邊表中的記錄。 2、where條件是在臨時表生成好後

★★★ oracle外連線,OracleLeft Outer Join和外關聯(+)的區別

【原】Oracle中Left Outer Join和外關聯(+)的區別 2008-03-23 16:22:37 Oracle的left join中on和where的區別 2009-09-28 15:20 今天遇到一個求某月所有天數的統計結果,如果某日的結果是0

Oracleleft joinon和where的區別

資料庫在通過連線兩張或多張表來返回記錄時,都會生成一張中間的臨時表,然後再將這張臨時表返回給使用者。     在使用left jion時,on和where條件的區別如下:     1、on條件是在生成臨時表時使用的條件,它不管on中的條件是否為真,都會返回左邊表中的記

MysqlLeft Join 與Right Join 與 Inner Join 與 Full Join的區別

chinese ron 兩張 ansi 左連接 ima money key sel 看看Left Join 與Right Join 與 Inner Join 與 Full Join對表進行操作後得到的結果。 在數據庫中新建兩張表,並插入要測試的數據。 新建表:

sql語句left join、right join、inner join的區別

select http img image ner -s style nbsp color left join(左聯接) 返回包括左表中的所有記錄和右表中聯結字段相等的記錄; right join(右聯接) 返回包括右表中的所有記錄和左表中聯結字段相等的記錄;inner j

Oracle查看所有和字段

oracle獲取表字段:select * from user_tab_columns where Table_Name=‘用戶表‘ order by column_name獲取表註釋:select * from user_tab_comments where Table_Name=‘用戶表‘order by

jpa/hibernate @onetomany 使用left join 添加多條件,可以使用過濾器filters (with-clause not allowed on fetched associations; use filters異常信息)

modified tran SQ fetch join vat reac sset nag package com.ipinyou.mip.dataAsset.campaignManagement.entity; import com.ipinyou.mip.util

sqlleft join、right join與inner join的區別

sql語句 mage 分享 app bubuko 3.1 from wid http 1、數據庫 1.1、作者表 1.2、圖書表 1.3、出版社表 2、left join   left join(左聯接) 返回包括左表中的所有記錄和右表中聯結字段相等的記錄。 2.

left join多條資料重複

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

Oracle手動建立emp和dept

以下的gw為使用者名稱,把gw改成自己的使用者名稱即可使用 CREATE TABLE gw.DEPT ( DEPTNO NUMBER(2) CONSTRAINT PK_DEPT PRIMARY KEY, DNAME VARCHAR2(14), LOC VARCHAR2(13) ); CREATE T

SQL left join合併去重技巧總結

 建表: CREATE TABLE `table1` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(60) DEFAULT NULL, `age` varchar(200) DEFAULT NULL,

left join on 後增加條件分析

SQL用過一定時間的同學,對left join,right join應該非常熟悉了,可能有些同學包括我在內, 對left/right join on 後面增加左表或右表條件後,或者多個left/right join 表不同的位置查詢結果 感覺到很不解,因此我對以下左連線做了分析演示:

Oracle建立scott使用者結構及初始化資料

文章目錄 1.部門表dept 2.僱員表emp 3.工資等級表salgrade 4.工資表bonus 由於安裝的是Oracle12c資料庫,沒有scott使用者。scott使用者中 dept、 emp、 salgrade、 b