測試一下你的Oracle有Full Outer Join的Bug麼?9i以上請進(2)

lastwinner發表於2005-11-23

Bug2: FULL OUTER JOIN = LEFT OUTER JOIN

奇怪的是,如果將
select a.*,b.mc MC1, c.mc MC2
from ts a,tdm b, tdm c
where A.dm1 = B.DM(+) AND B.type(+)='1'
and A.dm2 = c.DM(+) AND c.type(+)='2'
建立為檢視
create view vts as select a.*,b.mc MC1, c.mc MC2
from ts a,tdm b, tdm c
where A.dm1 = B.DM(+) AND B.type(+)='1'
and A.dm2 = c.DM(+) AND c.type(+)='2'
/
則下面的查詢結果就是正確的

[@more@]
程式碼:

SQL
> select s.*,p.* from
2 vts s full outer join
3
(select * from (select tp.*,rank()over(order by id) rn from tp) --where rn<10
4
) p
5 on s
.pid=p.id
6
/
ID PID DM1 DM2 MC1 MC2 ID CON RN ---- ---- ---- ---- ---------- ---------- ---- ---- ---------- 3 1 a ss AA SSSS 1 a 1
1 1 a aa AA AAAA 1 a 1
2 2 b BB 2 b 2
5 3 c CC 3 c 3
4 3 a ss AA SSSS 3 c 3
9 a AA
10 9
7 7 c ee CC
6 f

已選擇9行。
。。。。。。。。



但是加上一個無關緊要的條件限制後,查詢結果就不正確了,其結果也相當於是左連線
程式碼:

SQL
> select s.*,p.* from
2 vts s full outer join
3
(select * from (select tp.*,rank()over(order by id) rn from tp) where rn<10
4
) p
5 on s
.pid=p.id
6
/
ID PID DM1 DM2 MC1 MC2 ID CON RN ---- ---- ---- ---- ---------- ---------- ---- ---- ---------- 3 1 a ss AA SSSS 1 a 1
1 1 a aa AA AAAA 1 a 1
2 2 b BB 2 b 2
5 3 c CC 3 c 3
4 3 a ss AA SSSS 3 c 3
9 a AA
10 9
7 7 c ee CC

已選擇8行。
。。。。。。。



程式碼裡用的rank而沒用rownum,因為我這裡一用rownum就出現Ora-03113

若將select * from (select tp.*,rank()over(order by id) rn from tp) where rn<10也建立為一個檢視
create view vtp as select * from (select tp.*,rank()over(order by id) rn from tp) where rn<10
則Full Outer Join的查詢結果是正確的
程式碼:

SQL
> select s.*,p.* from
2 vts s full outer join
3 vtp p
4 on s
.pid=p.id
5
/
ID PID DM1 DM2 MC1 MC2 ID CON RN ---- ---- ---- ---- ---------- ---------- ---- ---- ---------- 3 1 a ss AA SSSS 1 a 1
1 1 a aa AA AAAA 1 a 1
2 2 b BB 2 b 2
5 3 c CC 3 c 3
4 3 a ss AA SSSS 3 c 3
9 a AA
10 9
7 7 c ee CC
6 f 4

已選擇9行。
........................

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29867/viewspace-810585/,如需轉載,請註明出處,否則將追究法律責任。

相關文章