日期:2014-05-17  浏览次数:20672 次

inner/left/right join 和 (+) 的区别
这两种方式有效率差别吗?

多表多字段连接能用(+)吗?
感觉就算能用写出来也比较混乱.

求教!

------解决方案--------------------
Oracle 建议你用在From语句后用Outer Join语法 而不是Oracle的Join操作符(+).而且(+)是要受下面的规则限制的,但Outer Join语法则不受的~~

1)你不可以在查询块中使用(+) 当它同时包含 join的from语句中
2)(+)只是在where语句中,并且只能对应一个表或视图的一行字段
3)如果A和B做联接时有多个条件,那么(+)必须完善所有的匹配条件,
如果没有 ,oracle不会警告你~只是结果自然不同的
4)不可以在作出一个表外查询 另张表内查询的(+)联接操作~~
5)不可以用(+)外联接到自己 当然Self Join是可以的
6)含(+)的Where后的注意
OR不可用
IN不可用
子查询不可用

以下给些个例子:

SQL code

SQL> desc part

 Name                                      Null?    Type
 ----------------------------------------- -------- -----------------
 PART_ID                                   NOT NULL VARCHAR2(4)
 SUPPLIER_ID                                        VARCHAR2(4)

SQL> select * from part;

PART SUPP
---- ----
P1   S1
P2   S2
P3
P4

SQL> desc supplier

 Name                                      Null?    Type
 ----------------------------------------- -------- -----------------
 SUPPLIER_ID                               NOT NULL VARCHAR2(4)
 SUPPLIER_NAME                             NOT NULL VARCHAR2(20)

SQL> select * from supplier;

SUPP SUPPLIER_NAME
---- --------------------
S1   Supplier#1
S2   Supplier#2
S3   Supplier#3





SQL> select p.part_id, s.supplier_name
  2  from part p, supplier s
  3  where p.supplier_id = s.supplier_id (+);

PART SUPPLIER_NAME
---- --------------------
P1   Supplier#1
P2   Supplier#2
P3
P4

--(+)是单向的

SQL> select p.part_id, s.supplier_name
  2  from part p, supplier s
  3  where p.supplier_id (+) = s.supplier_id (+);
where p.supplier_id (+) = s.supplier_id (+)
                        *
ERROR at line 3:
ORA-01468: a predicate may reference only one outer-joined table

--实现Full Join的方法

SQL> select p.part_id, s.supplier_name
  2  from part p, supplier s
  3  where p.supplier_id = s.supplier_id (+)
  4  union
  5  select p.part_id, s.supplier_name
  6  from part p, supplier s
  7  where p.supplier_id (+) = s.supplier_id;

PART SUPPLIER_NAME
---- --------------------
P1   Supplier#1
P2   Supplier#2
P3
P4
     Supplier#3

--现在的语法 
SQL> select p.part_id, s.supplier_name
  2  from part p full outer join supplier s
  3  on p.supplier_id = s.supplier_id;

PART SUPPLIER_NAME
---- --------------------
P1   Supplier#1
P2   Supplier#2
P4
P3
     Supplier#3