分享

oracle之join

 昵称7747500 2012-04-12
oracle之join
2011-02-23 11:08

Oracle之join

oracle多表联接

create table t_group_test(
  cust_id   number(12),
  prod_id    number(12),
  prod_value number(12)
)

create table t_prod_info(
prod_id number(12),
prod_info varchar2(12));

SQL> select * from t_group_test;

      CUST_ID       PROD_ID    PROD_VALUE
------------- ------------- -------------
          101          2001            12
          100          2001            12
          100          2002            13
          102          2002            13
          103          2001            12
          104          2003            14

6 rows selected

SQL> select * from t_prod_info ;

      PROD_ID PROD_INFO
------------- ------------
         2001 INFO_A
         2003 INFO_B
         2004 INFO_C
         2005 INFO_D
         2006 INFO_E
         2007 INFO_F

6 rows selected

    1. natural join  指明两表进行自然连接,并且连接是基于两表中所有同名字段
SQL> select cust_id,prod_id,prod_info
  2   from t_group_test a
  3  natural join t_prod_info b;

      CUST_ID       PROD_ID PROD_INFO
------------- ------------- ------------
          101          2001 INFO_A
          100          2001 INFO_A
          103          2001 INFO_A
          104          2003 INFO_B

    当t_prod_info表增加一个冗余列并且列值均为空时
alter table t_prod_info add(cust_id number(12));

SQL> select cust_id,prod_id,prod_info
  2   from t_group_test a
  3  natural join t_prod_info b;

      CUST_ID       PROD_ID PROD_INFO
------------- ------------- ------------

SQL>
    事实上,此时基于两个表中所有共同字段进行关联查询,由于冗余列值全为空值,无符合条件的查询结果。
SQL> alter table t_prod_info drop  column cust_id ;

    2.inner join  指明两表进行内连接,并且连接是基于指定条件,只取两表均符合条件的结果集
SQL> select cust_id,a.prod_id,prod_info
  2   from t_group_test a
  3  inner join t_prod_info b
  4  on (a.prod_id=b.prod_id) ;

      CUST_ID       PROD_ID PROD_INFO
------------- ------------- ------------
          101          2001 INFO_A
          100          2001 INFO_A
          103          2001 INFO_A
          104          2003 INFO_B

    3.full outer join  外部全连接
SQL> select cust_id,b.prod_id,prod_info
  2   from t_group_test a
  3  full outer join t_prod_info b
  4  on (a.prod_id=b.prod_id) ;

   CUST_ID       PROD_ID PROD_INFO
---------- ------------- ------------
       103          2001 INFO_A
       100          2001 INFO_A
       101          2001 INFO_A
       104          2003 INFO_B
       102              
       100              
                    2006 INFO_E
                    2004 INFO_C
                    2005 INFO_D
                    2007 INFO_F

10 rows selected

    4.left outer join 左外连接
SQL> select cust_id,b.prod_id,prod_info
  2   from t_group_test a
  3  left outer join t_prod_info b
  4  on (a.prod_id=b.prod_id)
  5  order by  cust_id,b.prod_id,prod_info;

      CUST_ID       PROD_ID PROD_INFO
------------- ------------- ------------
          100          2001 INFO_A
          100              
          101          2001 INFO_A
          102              
          103          2001 INFO_A
          104          2003 INFO_B

6 rows selected

   oracle特有之左外连接
SQL> select cust_id,b.prod_id,prod_info
  2   from t_group_test a, t_prod_info b
  3  where a.prod_id=b.prod_id(+)
  4  order by  cust_id,b.prod_id,prod_info ;

      CUST_ID       PROD_ID PROD_INFO
------------- ------------- ------------
          100          2001 INFO_A
          100              
          101          2001 INFO_A
          102              
          103          2001 INFO_A
          104          2003 INFO_B

6 rows selected

    5.right outer join
SQL> select cust_id,b.prod_id,prod_info
  2   from t_group_test a
  3  right outer join t_prod_info b
  4  on (a.prod_id=b.prod_id)
  5  order by  cust_id,b.prod_id,prod_info;

      CUST_ID       PROD_ID PROD_INFO
------------- ------------- ------------
          100          2001 INFO_A
          101          2001 INFO_A
          103          2001 INFO_A
          104          2003 INFO_B
                       2004 INFO_C
                       2005 INFO_D
                       2006 INFO_E
                       2007 INFO_F

8 rows selected

    oracle特有连接语法之右外连接
SQL> select cust_id,b.prod_id,prod_info
  2   from t_group_test a, t_prod_info b
  3  where a.prod_id(+)=b.prod_id
  4  order by  cust_id,b.prod_id,prod_info ;

      CUST_ID       PROD_ID PROD_INFO
------------- ------------- ------------
          100          2001 INFO_A
          101          2001 INFO_A
          103          2001 INFO_A
          104          2003 INFO_B
                       2004 INFO_C
                       2005 INFO_D
                       2006 INFO_E
                       2007 INFO_F

8 rows selected

 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多