Oracle-联表查询

内联表

1
2
3
SELECT table1.column, table2.column
FROM table1, table2
WHERE table1.column = table2.column;

外联表

1
2
3
4
5
6
7
8
/*table1 的数据少,table2 的数据多,需要填充左侧*/
SELECT table1.column, table2.column
FROM table1, table2
WHERE table1.column(+) = table2.column;
/*table1 的数据多,table2 的数据少,需要填充右侧*/
SELECT table1.column, table2.column
FROM table1, table2
WHERE table1.column = table2.column(+);

注意:外关联无法使用子查询

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
SELECT A.*
FROM PS_A_TBL A
LEFT JOIN PS_B_TBL B
ON A.KEY1 = B.KEY1
AND A.KEY2 = B.KEY2
AND B.EFFDT = (SELECT MAX(B1.EFFDT)
FROM PS_B_TBL B1
WHERE B1.KEY1 = B.KEY1
AND B1.KEY2 = B.KEY2
AND B1.EFFDT <= SYSDATE)
--上诉例子就是一个错误的使用方法,如果一定要用外关联,即B表数据少于A表,又要以A表为基表进行查询,可以使用下面的写法:
SELECT A.*
FROM PS_A_TBL A, PS_B_TBL B
WHERE A.KEY1 = B.KEY1(+)
AND A.KEY2 = B.KEY2(+)
AND (B.EFFDT = (SELECT MAX(B1.EFFDT)
FROM PS_B_TBL B1
WHERE B1.KEY1 = B.KEY1
AND B1.KEY2 = B.KEY2
AND B1.EFFDT <= SYSDATE) OR B.EFFDT IS NULL)