当前位置: 首页 > 面试题库 >

为什么Oracle SQL神秘地解决一个联接中的歧义而不解决其他联接中的歧义

昝晗昱
2023-03-14
问题内容

我是Oracle10g用户。我不得不编写一些SQL查询,并发现了一个神秘的行为(如我所见)。假设我们有一个表,该表能够以某种简单的两级树结构进行连接。下一个查询给我“歧义错误”,这是预期的:

select title
  from table1
    left join table1 on condition

但是,如果我要在联接中再添加一个表,歧义问题将简单地消失:

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

请问对此有何解释?我完全想念它…完整的测试用例可以在http://pastebin.com/webf513w中找到


问题答案:

对于第三个查询,Oracle 10g从第二个TestTable1(别名TestTable1_2)返回field3。这似乎是一个错误,似乎已在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)


 类似资料:
  • 在ANTLR4中,我有一个lexer规则,说我可以使用任何字符得到任何单词,但空格和换行符除外。其定义如下: 我还有一个lexer规则(定义在than WORD之前),用于进入EVAL模式: 我考虑的另一个选择是将“word”定义为${and}包围的文本以外的任何东西。但我不知道如何创建这样的lexer规则。 我该怎么解决?要区分评价和词?

  • 在ANTLR v3中,句法谓词可以用来解决例如悬空的else问题。ANTLR4似乎接受具有类似歧义的语法,但在解析过程中它会报告这些歧义(例如,“line 2:29 reportAmbiguity d=0(e):ambigalts={1,2},input=...”)。它生成一个解析树,尽管存在这些歧义(根据文档,通过选择第一个备选方案)。但如果我想让它选择其他选择,我能做什么呢?换句话说,我如何显

  • 使用上面的测试数据运行ANTLR4测试平台,输出为 我可以看到第一个标记是ID的<4>,值为'rrv0' 我已经尝试重新安排lexer项目顺序。我还尝试通过在语法规则中显式匹配来使用隐式lexer项(而不是通过显式lexer项)。我也试着做火柴。那些对我来说并不成功。

  • 问题内容: public static void main(String… args){ then(bar()); // Compilation Error } 编译结果(从命令行) 为什么这种方法模棱两可?该代码在Java 7下成功编译! 将方法栏更改为: 编译没有任何问题,但是在IntelliJ Idea中报告为错误(无法解析method )。 此代码在Java 7下失败- : Java版本

  • 问题内容: 在这里,输出是 字符串空 JVM为什么使用String参数将方法解析为一种? 在此先感谢J 问题答案: 这是一个相当复杂的算法,在JLS 15.12中进行了 详细介绍。但是这里相关的部分是15.12.2,它说“选择了最具体的部分”。对象和字符串重载都是“可访问且适用的”(字符串适用,因为空文字是所有类型的引用),并且字符串更具体。 编辑:根据语法更正的部分。

  • 在ANTLR v3中,句法谓词可以用来解决歧义,即明确地告诉ANTLR应该选择哪一个选项。ANTLR4似乎只是简单地接受具有类似歧义的语法,但在解析过程中它会报告这些歧义。它生成一个解析树,尽管存在这些歧义(根据文档,通过选择第一个备选方案)。但如果我想让它选择其他选择,我能做什么呢?换句话说,我如何显式地解决歧义? (关于悬而未决的else问题的简单情况,请参见:在ANTLR4中使用什么来解决歧