首页 > 代码库 > Oracle_多表连接

Oracle_多表连接

盗亦有道:http://www.blogjava.net/hello-yun/archive/2011/04/08/347890.html

TESTA,TESTB,TESTC,各有A, B两列:

TESTA(A,B) |    TESTB(A,B)   |    TESTC(A,B)

001      10A    |    001     10B     |    001    10C

002      20A    |    003     30B     |    004    30C

 

连接分为两种:内连接与外连接。

 

A.内连接:

 

内连接,即最常见的等值连接,例:

 

SELECT * 
FROM TESTA,TESTB
WHERE TESTA.A=TESTB.A


结果:

TESTA(A,B)    |    TESTB(A,B)

001    10A     |     001     10B

 

B.外连接

 

外连接分为左外连接,右外连接和全外连接。

 

1. 左外连接 left outer join 或者 left join

 

左外连接就是在等值连接的基础上加上主表中的未匹配数据,例:

 

SELECT *
FROM TESTA 
LEFT OUTER JOIN TESTB 
ON TESTA.A=TESTB.A

 

Oracle 支持另一种写法

 

SELECT * 
FROM TESTA,TESTB
WHERE TESTA.A=TESTB.A(+)

 

结果:

TESTA(A,B)    |    TESTB(A,B)

001     10A    |     001     10B

002     20A    |    

 

三个表做左外连接

 

SELECT *
FROM TESTA 
LEFT OUTER JOIN TESTB 
ON TESTA.A=TESTB.A
LEFT OUTER JOIN TESTC
ON TESTA.A=TESTC.A

 

Oracle 支持的另外一种写法

 

SELECT *
FROM TESTA,TESTB,TESTC
WHERE TESTA.A=TESTB.A(+)
AND TESTA.A=TESTC.A(+)

 

结果:

TESTA(A,B)    |     TESTB(A,B)    |     TESTC(A,B)

001     10A     |      001     10B    |      001    10C

002     20A     |

 

2. 右外连接 right outer join 或者 right join

 

右外连接是在等值连接的基础上加上被连接表的不匹配数据

 

SELECT *
FROM TESTA 
RIGHT OUTER JOIN TESTB 
ON TESTA.A=TESTB.A

 

Oracle支持的另一种写法

 

SELECT *
FROM TESTA,TESTB
WHERE TESTA.A(+)=TESTB.A

 

结果:

 

TESTA(A,B)    |    TESTB(A,B)

 

001     10A     |     001     10B

                       |    003      20B

 

3.全外连接 full outer join 或者 full join

 

全外连接是在等值连接的基础上将左表和右表的未匹配数据都加上

 

SELECT * 
FROM TESTA 
FULL OUTER JOIN TESTB
ON TESTA.A=TESTB.A

 

全外连接的等价写法,对同一表先做左连接,然后右连接

 

SELECT  TESTA.*,TESTB.*
FROM TESTA
LEFT OUTER JOIN TESTB
ON TESTA.A=TESTB.A
UNION
SELECT TESTA.*,TESTB.*
FROM TESTB
LEFT OUTER JOIN TESTA
ON TESTA.A=TESTB.A

 

结果:

 

TESTA(A,B)    |    TESTB(A,B)

 

 

001     10A     |     001     10B

002     20A     |  

        |     003     20B