首页 > 默认 > 转贴: 简单介绍join,outer-join,semi-join,anti-join的区别

转贴: 简单介绍join,outer-join,semi-join,anti-join的区别

2013年12月23日 admin 发表评论 阅读评论

简单介绍join,outer-join,semi-join,anti-join的区别

表连接的方式如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

 

 

关于作者:

昵称:admin
档案信息:商云方 (yunfang.shang@hand-china.com), HAND技术服务中心
联系方式:你可以通过syfvb@hotmail.com联系作者
点击查看admin发表过的所有文章...
本文永久链接: http://blog.retailsolution.cn/archives/3466

 

 

对本文的评价:

1 Star2 Stars3 Stars4 Stars5 Stars (No Ratings Yet)
Loading ... Loading ...

 

 

分类: 默认 标签:
  1. 本文目前尚无任何评论.
  1. 本文目前尚无任何 trackbacks 和 pingbacks.
您必须在 登录 后才能发布评论.