Oracle表示列含义模糊,但所有列都完全合格

时间:2015-12-09 20:23:30

标签: oracle oracle11g

我有两个架构,SCHEMA1SCHEMA2。它们都包含一个名为TBL的表,TBL的DDL在两个模式中都是完全相同的

这是我的疑问:

         SELECT SCHEMA1.TBL.PK_COL source_pk, SCHEMA2.TBL.PK_COL master_pk
           FROM SCHEMA1.TBL
LEFT OUTER JOIN SCHEMA2.TBL
             ON SCHEMA1.TBL.PK_COL = SCHEMA2.TBL.PK_COL
          WHERE SCHEMA1.TBL.PK_COL <= :pk_col_source_ceil
            AND SCHEMA1.TBL.MODIFY_DT >= :modify_dt_source_floor
            AND SCHEMA1.TBL.MODIFY_DT > SCHEMA2.TBL.MODIFY_DT - :modify_dt_source_lag    
/

当我运行它时,Oracle抱怨道:

ORA-00918: column ambiguously defined

但我明确地将列完全限定在各处。为什么甲骨文恨我?

我的Oracle版本是11.2.0.4.0。

1 个答案:

答案 0 :(得分:4)

转载错误:

09/12/2015 18:46:45:SQL> SELECT * FROM V$VERSION;

BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
PL/SQL Release 11.2.0.4.0 - Production
CORE    11.2.0.4.0      Production
TNS for Linux: Version 11.2.0.4.0 - Production
NLSRTL Version 11.2.0.4.0 - Production

09/12/2015 18:46:45:SQL> SELECT schema1.tbl.pk_col source_pk, schema2.tbl.pk_col master_pk
  2    FROM schema1.tbl
  3    LEFT OUTER JOIN schema2.tbl ON schema1.tbl.pk_col = schema2.tbl.pk_col
  4   WHERE schema1.tbl.pk_col <= 10
  5         AND schema1.tbl.modify_dt >= SYSDATE
  6         AND schema1.tbl.modify_dt > schema2.tbl.modify_dt - 1;
       AND schema1.tbl.modify_dt > schema2.tbl.modify_dt - 1
           *
ERROR at line 6:
ORA-00918: column ambiguously defined

使用别名进行测试,它可以正常工作。

09/12/2015 18:56:09:SQL> SELECT T1.PK_COL source_pk, T2.PK_COL master_pk
  2             FROM SCHEMA1.TBL T1
  3  LEFT OUTER JOIN SCHEMA2.TBL T2
  4               ON T1.PK_COL = T2.PK_COL
  5            WHERE T1.PK_COL <= 10--:pk_col_source_ceil
  6              AND T1.MODIFY_DT >= sysdate --:modify_dt_source_floor
  7              AND T1.MODIFY_DT > T2.MODIFY_DT - 1--:modify_dt_source_lag
  8  /

no rows selected

文档声明:

  

如果两个或多个表有一些共同的列名,如果有的话   在FROM子句中指定连接,则必须限定列   具有表或表别名的名称。

有趣的是,当表名称本身是共同的时,只有表别名可用。架构名称不会在此处删除。

Oracle Docs reference