|
一、问题起源。
疑惑起源于看到一个SQL里有这样的一段表达式
AND A.CARD_ID = B.CARD_ID(+)
AND B.DEPT_ID(+)[/COLOR] IS NULL
AND B.ORGAN_ID(+)[/COLOR] = '1'
“B.DEPT_ID(+) IS NULL”和“B.ORGAN_ID(+) = '1'”,怎么这里面也会有“(+)”加号呢?
二、实验。
我做了实验。假设A、B两个表。
A.TITLE B.TITLE
------- -------
1 1
2 2
3 4
1、常见的外连接(左连接)
SQL> select * from A,B
2 where A.title = B.title(+);
TITLE TITLE
----- -----
1 1
2 2
3
2、我看不懂的写法。B.title(+) = 1
SQL> select * from A,B
2 where A.title = B.title(+);
3 and B.title(+) = 1;
TITLE TITLE
----- -----
1 1[/COLOR]
2
3
3、再来一种写法,B.title = 1,就开始搞脑子了。
SQL> select * from A,B
2 where A.title = B.title(+);
3 and B.title = 1;
TITLE TITLE
----- -----
1 1
大家能谈谈 2和3的执行顺序吗?从逻辑上我们怎么去一步一步的推断执行的结果呢?
三、又想到了标准SQL。
接着问题又来了。
现在都推荐写标准SQL语句了。9i也支持SQL99标准的连接写法。
看,干净利落的左连接。
SQL> select t1.title,t2.title
2 from test_join_1 t1 LEFT OUTER JOIN test_join_2 t2
3 ON (t1.title=t2.title);
TITLE TITLE
----- -----
1 1
2 2
3
问题是,怎么使用标准SQL来达到前面实验中第2点所表现的结果呢?
当然,可以通过decode函数。
SQL> select t1.title,decode(t2.title,1,t2.title,NULL)
2 from test_join_1 t1 LEFT OUTER JOIN test_join_2 t2
3 ON (t1.title=t2.title);
TITLE DECODE(T2.TITLE,1,T2.TITLE,NUL
----- ------------------------------
1 1
2
3
不过decode函数好像也不是标准函数。
所以再请大家谈谈有何见解?是不是用标准的SQL就是不能了?
谢谢。 |
|