我有两个架构,SCHEMA1
和SCHEMA2
。它们都包含一个名为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。
答案 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子句中指定连接,则必须限定列 具有表或表别名的名称。
有趣的是,当表名称本身是共同的时,只有表别名可用。架构名称不会在此处删除。