Oracle中left join中右表的限制條件
無過濾條件的LEFT JOIN
SQL中最簡單形式的LEFT JOIN,是直接根據關聯欄位,以左表為基準,對右表進行匹配。在SELECT語句中選取的欄位,如果有右表的記錄(一般都是需要右表的某些記錄的),取出配對成功的右表記錄中對應的這個欄位的值;否則,直接置NULL。這本身就是LEFT JOIN的特點:保證左表記錄完整,右表只是輔助匹配。
直接看例子,為了演示,準備了兩張測試表test1,test2:
Sql程式碼- select * from test1
Sql程式碼
- select * from test2
Sql程式碼
-
select
- left join test1 t1
- 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字句中
- select t2.*,t1.market_place_id from test2 t2
- left join test1 t1
- on t2.parent_asin=t1.asin and t1.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子句中
相關推薦
Oracle中left join中右表的限制條件
無過濾條件的LEFT JOIN SQL中最簡單形式的LEFT JOIN,是直接根據關聯欄位,以左表為基準,對右表進行匹配。在SELECT語句中選取的欄位,如果有右表的記錄(一般都是需要右表的某些記錄的),取出配對成功的右表記錄中對應的這個欄位的值;否則,直接置NULL。這本身就是LEFT JOIN的特點
oracle中left join,right join,inner join的坑
本文主要是記錄一下實際使用oracle中join查詢遇到的坑 1.用到兩張表,學生表和學年分數表,先建立 2.普通連線查詢 INNER JOIN,查詢每個學年有成績的學生以及分數情況 LFET JOIN 和 RIGHT JOIN 也類似,不舉例了。 以下重點是說以下,連線的時
sql中left join on 多個條件需要特殊注意之處
定義: LEFT JOIN 關鍵字會從左表 (table_name1) 那裡返回所有的行,即使在右表 (table_name2) 中沒有匹配的行。例如如下查詢: SELECT column_name(s) FROM table_name1 LEFT JOIN table_
oracle的left 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=
Oracle在left 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
Oracle的left join中on和where的區別以及與(+)的區別
資料庫在通過連線兩張或多張表來返回記錄時,都會生成一張中間的臨時表,然後再將這張臨時表返回給使用者。 在使用left jion時,on和where條件的區別如下: 1、 on條件是在生成臨時表時使用的條件,它不管on中的條件是否為真,都會返回左邊表中的記錄。 2、where條件是在臨時表生成好後
★★★ oracle外連線,Oracle中Left Outer Join和外關聯(+)的區別
【原】Oracle中Left Outer Join和外關聯(+)的區別 2008-03-23 16:22:37 Oracle的left join中on和where的區別 2009-09-28 15:20 今天遇到一個求某月所有天數的統計結果,如果某日的結果是0
Oracle的left join中on和where的區別
資料庫在通過連線兩張或多張表來返回記錄時,都會生成一張中間的臨時表,然後再將這張臨時表返回給使用者。 在使用left jion時,on和where條件的區別如下: 1、on條件是在生成臨時表時使用的條件,它不管on中的條件是否為真,都會返回左邊表中的記
Mysql中Left 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
sql中left 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