oracle的join的好奇怪。

[复制链接]
查看11 | 回复6 | 2007-10-20 08:38:44 | 显示全部楼层 |阅读模式
有三个表,分别是:TEST1、TEST2、TEST3。它们的结构和内容分别如下:
SQL> select * from test1;

ID
ID2 USERFLAG
---------------- --------------------------------------- --------
1
1 1
3
2 0
SQL> select * from test2;

ID
ID2 USERFLAG
---------------- --------------------------------------- --------
1
2 1
3
3 0
SQL> select * from test3;

ID
ID2 USERFLAG
---------------- --------------------------------------- --------
1
2 0
3
3 1
然后我执行下面的查询,Oracle不会报”ORA-00918: 未明确定义列“,而是直接将where子句中的USERFLAG认为是TEST3的字段。这是不是Oracle的Bug啊?
SQL> SELECT A.ID AID, B.ID, A.USERFLAG AU, B.USERFLAG BU, C.USERFLAG CU
2FROM TEST1 A
3
inner JOIN TEST2 B ON A.ID=B.ID
4
inner JOIN TEST3 C ON B.ID=C.ID
5WHERE [B]USERFLAG [/B]= 1
6/

AID
ID
AU BU CU
---------------- ---------------- -- -- --
3
3
001
回复

使用道具 举报

千问 | 2007-10-20 08:38:44 | 显示全部楼层
然后我执行下面的查询,Oracle不会报”ORA-00918: 未明确定义列“,而是直接将where子句中的USERFLAG认为是TEST3的字段。这是不是Oracle的Bug啊?
SQL> SELECT A.ID AID, B.ID, A.USERFLAG AU, B.USERFLAG BU, C.USERFLAG CU
2 FROM TEST1 A
3 inner JOIN TEST2 B ON A.ID=B.ID
4 inner JOIN TEST3 C ON B.ID=C.ID
5 WHERE USERFLAG = 1
6 /
AID ID AU BU CU
---------------- ---------------- -- -- --
3 3 0 0 1

由 hutuboy


我想WHERE USERFLAG = 1 没加表名,就会默认最后一个表.只是这样认为的,做了如下个实验, 高手指点.

SQL> select * from test1;

ID
ID2
USERING
--------------------------------------- --------------------------------------- ---------------------------------------

1
5
1

3
2
1
SQL> select * from test2;

ID
ID2
USERING
--------------------------------------- --------------------------------------- ---------------------------------------

1
6
1

3
3
0
SQL> select * from test3;

ID
ID2
USERING
--------------------------------------- --------------------------------------- ---------------------------------------

1
2
0

3
3
1
SQL>

SQL> SELECT A.id, A.id2, B.id,b.id2,c.id,c.id2, A.usering AU, B.usering BU, C.usering CU
2FROM TEST1 A
3inner JOIN TEST3 C ON a.ID=C.ID
4inner JOIN TEST2 B ON A.ID=B.ID
5WHERE usering = 1;

ID
ID2
ID
ID2
ID
ID2
AU
BU
CU
--------------------------------------- --------------------------------------- --------------------------------------- --------------------------------------- --------------------------------------- --------------------------------------- --------------------------------------- --------------------------------------- ---------------------------------------

1
5
1
6
1
2
1
1
0
SQL>
SQL> SELECT A.id, A.id2, B.id,b.id2,c.id,c.id2, A.usering AU, B.usering BU, C.usering CU
2FROM TEST1 A
3inner JOIN TEST2 b ON a.ID=b.ID
4inner JOIN TEST3 c ON A.ID=c.ID
5WHERE usering = 1;

ID
ID2
ID
ID2
ID
ID2
AU
BU
CU
--------------------------------------- --------------------------------------- --------------------------------------- --------------------------------------- --------------------------------------- --------------------------------------- --------------------------------------- --------------------------------------- ---------------------------------------

3
2
3
3
3
3
1
0
1
SQL>
SQL> SELECT A.id, A.id2, B.id,b.id2,c.id,c.id2, A.usering AU, B.usering BU, C.usering CU
2FROM TEST3 c
3inner JOIN TEST2 b ON c.ID=b.ID
4inner JOIN TEST1 a ON A.ID=c.ID
5WHERE usering = 1;

ID
ID2
ID
ID2
ID
ID2
AU
BU
CU
--------------------------------------- --------------------------------------- --------------------------------------- --------------------------------------- --------------------------------------- --------------------------------------- --------------------------------------- --------------------------------------- ---------------------------------------

1
5
1
6
1
2
1
1
0

3
2
3
3
3
3
1
0
1
回复

使用道具 举报

千问 | 2007-10-20 08:38:44 | 显示全部楼层
请问在三张表同时查询的时候..你的USERFLAG是哪张的啊
回复

使用道具 举报

千问 | 2007-10-20 08:38:44 | 显示全部楼层
from test1,test2,test3
oracle 是将最后一个表作为基表去查询的,所以认为是test3的U = 1
回复

使用道具 举报

千问 | 2007-10-20 08:38:44 | 显示全部楼层
guan zhu
回复

使用道具 举报

千问 | 2007-10-20 08:38:44 | 显示全部楼层
不过还是要养成将指定每个字段的表名的习惯以便维护工作
回复

使用道具 举报

千问 | 2007-10-20 08:38:44 | 显示全部楼层
这样的问题还真没遇到过,以后注意!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行