ZT:簡單介紹join,outer-join,semi-join,anti-join的區別
http://www.itpub.net/showthread.php?s=&postid=7357788#post7357788
表連線的方式如join,semi-join,outer-join,anti-join;
表連線的實現方式如nested loop,merge,hash.
本文簡單的介紹表連線的方式join,semi-join,outer-join,anti-join和適用情景。
假設2個資料來源(row source).
Emp(id pk,ename,deptno) Dept(deptno pk,dname)
如下是join
select ename,dname from emp,dept where emp.deptno=dname.deptno;
2個資料來源鍵值一一比較,返回相互匹配的記錄集
for example: nested loop join
for x in ( select * from emp )
loop
for y in ( select * from dept)
loop
if ( x.deptno == y.deptno )
OutPut_Record(x.ename,y.dname)
End if
end loop
end loop
outer-join
select ename,dname from emp,dept where emp.deptno= dept.deptno(+);
select ename,dname from emp,dept where emp.deptno(+)=dept.deptno;
2個資料來源鍵值一一比較,返回相互匹配的;但如果在另外一個row source沒有找到匹配的也返回記錄
for example: nested loop outer-join
for x in ( select * from emp )
loop
find_flag=false;
for y in ( select * from dept)
loop
if ( x.deptno == y.deptno )
OutPut_Record(x.ename,y.dname)
Find_flag=true
End if
end loop
if ( find_flag == false )
OutPut_Record(x.ename,null)
End if
end loop
semi-join
select dname from dept where exists( select null from emp where emp.deptno=dept.deptno)
多在子查詢exists中使用,對外部row source的每個鍵值,查詢到內部row source匹配的第一個鍵值後就返回,如果找到就不用再查詢內部row source其他的鍵值了。
for example: nested loop semi-join
for x in ( select * from dept )
loop
for y in ( select * from emp)
loop
if ( x.deptno == y.deptno )
OutPut_Record(x.dname)
Break;
End if
end loop
end loop
anti-join
select ename,deptno from emp,dept where emp.deptno!=dept.deptno
多用於!= not in 等查詢;如果找到滿足條件(!= not in)的不返回,不滿足條件(!= not in)的返回。和join相反。
for example: nested loop anti-join
for x in ( select * from emp )
loop
for y in ( select * from dept)
loop
if ( x.deptno != y.deptno )
OutPut_Record(x.dname,y.deptno)
End if
end loop
end loop
More information get document
http://blog.itpub.net/post/901/12680
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/267265/viewspace-83013/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- SQL JOIN 簡單介紹SQL
- URL和URI的區別簡單介紹
- callee與caller的區別簡單介紹
- 簡單介紹 "&&" 與 “&” 和 ”|“ 與 ”||“ 的區別
- closest()、parents()和parent()方法的區別簡單介紹
- 簡單介紹HTTP與HTTPS之間的區別HTTP
- javascript原始值和物件的主要區別簡單介紹JavaScript物件
- inherit和initial屬性值區別簡單介紹
- SQL | JOIN 型別使用介紹SQL型別
- document.documentElement和document.body區別簡單介紹
- SQL中的Filter, join, semi-join等概念的釋義SQLFilter
- height:inherit和height:100%的區別簡單介紹
- orm的method屬性值post和get的區別簡單介紹ORM
- max-height和height屬性的區別簡單介紹
- javascript Object型別物件簡單介紹JavaScriptObject型別物件
- Webpack 的簡單介紹Web
- Promise的簡單介紹Promise
- CFRunloopObserverRef 的簡單介紹OOPServer
- join、inner join、left join、right join、outer join的區別
- SVG簡單介紹SVG
- HTML簡單介紹HTML
- ActiveMQ簡單介紹MQ
- HTML 簡單介紹HTML
- JavaScript 簡單介紹JavaScript
- CSS 簡單介紹CSS
- SCSS 簡單介紹CSS
- UICollectionView 簡單介紹UIView
- css簡單介紹CSS
- SpringMvc的簡單介紹SpringMVC
- javascript的this用法簡單介紹JavaScript
- noscript的作用簡單介紹
- Redux的簡單概念介紹Redux
- ORACLE SEQUENCE的簡單介紹Oracle
- javascript資料型別轉換簡單介紹JavaScript資料型別
- javascript異常報錯型別簡單介紹JavaScript型別
- input:file上傳型別控制簡單介紹型別
- Transformation之NUll-aware Anti-join(NAAJ)【九】ORMNull
- 使用exists(Semi-Join)優化distinct語句優化