为什么Oracle SQL在一个连接中神秘地解决了歧义,而在其他连接中却没有

为什么Oracle SQL在一个连接中神秘地解决了歧义,而在其他连接中却没有,sql,oracle,oracle10g,ambiguity,Sql,Oracle,Oracle10g,Ambiguity,我是Oracle 10g用户。我不得不编写一些SQL查询,并发现了一种神秘的(在我看来)行为。让我们假设我们有一个表,它能够以某种简单的两级树结构连接自身。下一个查询将给出“歧义错误”,预期为: select title from table1 left join table1 on condition 但是,如果我在连接中再添加一个表,那么歧义问题就会消失: select title from table1 join table2 on other_condition

我是Oracle 10g用户。我不得不编写一些SQL查询,并发现了一种神秘的(在我看来)行为。让我们假设我们有一个表,它能够以某种简单的两级树结构连接自身。下一个查询将给出“歧义错误”,预期为:

select title
  from table1
    left join table1 on condition
但是,如果我在连接中再添加一个表,那么歧义问题就会消失:

select title
  from table1
    join table2 on other_condition
    left join table1 on condition

对此有何解释?我完全想念它。。。完整的测试用例可以在

中找到,对于第三个查询,Oracle 10g从第二个TestTable1(别名TestTable1_2)返回字段3。这似乎是一个bug,似乎已经在11g中修复

测试用例:

INSERT INTO TestTable1 VALUES (1,2,3,NULL);
INSERT INTO TestTable1 VALUES (2,5,6,1);
INSERT INTO TestTable2 VALUES (5,6,7);
INSERT INTO TestTable2 VALUES (2,20,30);

SELECT field3
FROM TestTable1
join TestTable2 ON TestTable1.field1 = TestTable2.field1
left join TestTable1 TestTable1_2 ON TestTable1.self_ref = TestTable1_2.id;

FIELD3
======
3
(null)

SELECT TestTable1.field3, TestTable2.field3, TestTable1_2.field3
FROM TestTable1
join TestTable2 ON TestTable1.field1 = TestTable2.field1
left join TestTable1 TestTable1_2 ON TestTable1.self_ref = TestTable1_2.id;

FIELD3 FIELD3_1 FIELD3_2
====== ======== ========
6      7        3
3      30       (null)

EXPLAIN告诉您这两个查询的内容是什么?FWIW 11g报告,对于给定的所有示例查询,字段3的定义不明确。>EXPLAIN告诉您这两个查询的内容是什么?第一个查询无法解释,因为它给出了“歧义错误”。对于第二个问题,我在10g(Express Edition 10.2.0.1.0)中再现了这种行为——第三个查询运行时没有错误。11gR1为所有三个查询提供了预期的ORA-00918。有关特定的Oracle支持参考和受影响的版本,请参阅我对另一个类似问题的回答:有关特定的Oracle支持参考和受影响的版本,请参阅我对另一个类似问题的回答: