【问题标题】:Oracle join not workingOracle 加入不起作用
【发布时间】:2011-06-10 20:56:57
【问题描述】:

我正在尝试从我的银行管理员那里获取所有 IFSC 代码和详细信息(银行唯一代码),该代码以输入的 IFSC 代码的前 4 个字符开头。我有银行主表,其中包括 IFSC 代码(4 个字符),相应的银行详细信息。

查询的主要部分如下。

AND D.IFSC_CODE=UPPER(substr(B.BANK_CODE,1,4)) (+) ORDER BY....

当我执行此查询时,我收到一条错误消息“ORA-00936:缺少表达式”。

我对查询的期望是:

  • 如果银行存在于输入的 IFSC 代码对应的银行主文件中,则返回详细信息
  • 只有输入的 IFSC 才会显示

当我像这样重写查询时

AND D.IFSC_CODE(+) =UPPER(substr(B.BANK_CODE,1,4)) ORDER BY....

没有错误,但结果不是我预期的。

我该如何解决这个问题?

【问题讨论】:

  • 让我们忘记古老的 oracle 语法,使用新的、现代的 ansi join!
  • 如何发布整个查询(最好使用相关的 CREATE TABLE 甚至示例数据)。

标签: oracle join oracle11g ora-00936


【解决方案1】:

在复杂的外连接表达式中,您可以将 (+) 运算符放在所有相关列上,如下所示:

AND D.IFSC_CODE=UPPER(substr(B.BANK_CODE (+),1,4))

例如:

SQL> WITH table_a AS (
  2     SELECT '0001' ID FROM dual
  3     UNION ALL SELECT '0002' FROM dual
  4     UNION ALL SELECT '0003' FROM dual
  5  ), table_b AS (
  6     SELECT '0001a' ID FROM dual
  7     UNION ALL SELECT '0002b' FROM dual
  8  )
  9  SELECT a.id, b.id
 10    FROM table_a a, table_b b
 11   WHERE a.id = substr(b.id (+), 1, 4);

ID   ID
---- -----
0001 0001a
0002 0002b
0003 

这种形式的外连接是 Oracle 特有的,可以说比 SQL ANSI 外连接更难阅读。此外,这种旧方法禁用了某些特定功能(完全外连接,外连接到多个表)。在 SQL ansi join 表单中,查询如下所示:

SQL> WITH table_a AS (
  2     SELECT '0001' ID FROM dual
  3     UNION ALL SELECT '0002' FROM dual
  4     UNION ALL SELECT '0003' FROM dual
  5  ), table_b AS (
  6     SELECT '0001a' ID FROM dual
  7     UNION ALL SELECT '0002b' FROM dual
  8  )
  9  SELECT a.id, b.id
 10    FROM table_a a
 11    LEFT OUTER JOIN table_b b ON a.id = substr(b.id, 1, 4);

ID   ID
---- -----
0001 0001a
0002 0002b
0003 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-22
    • 2017-04-21
    • 1970-01-01
    • 2013-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-11
    相关资源
    最近更新 更多