ORA-00918: 列定义不明确,使用 DB Link
ORA-00918: column ambigously defined, using DB Link
当我执行下面的查询时,我收到以下错误消息:
ORA-00918: column ambigously defined
ORA-02063: preceding line from ABC
查询:
SELECT
dos.*,
cmd.*,
cmd_r.*,
adr_inc.*,
adr_veh.*,
loc.*,
fou_d.*,
fou_r.*, --Works if I comment this line
mot.*
FROM
DOSSIERS@ABC dos
LEFT JOIN CMDS@ABC cmd ON cmd.DOS_CODE_ID = dos.dos_code_id
LEFT JOIN CMDS_RECCSTR@ABC cmd_r ON cmd_r.DOS_CODE_ID = dos.DOS_CODE_ID AND cmd_r.CMD_CODE_ID = cmd.CMD_CODE_ID AND cmd_r.CMD_DT_CREAT = cmd.CMD_DT_CREAT
LEFT JOIN HISTO_ADR@ABC adr_inc ON adr_inc.DOS_CODE_ID = dos.DOS_CODE_ID
LEFT JOIN HISTO_ADR@ABC adr_veh ON adr_veh.DOS_CODE_ID = dos.DOS_CODE_ID
LEFT JOIN LOC@ABC loc ON dos.DOS_CODE_ID = loc.DOS_CODE_ID
LEFT JOIN FOURNISS@ABC fou_d ON fou_d.PAY_CODE_ID = loc.PAY_CODE_ID_D AND fou_d.FOU_CODE_ID = loc.FOU_CODE_ID_D
LEFT JOIN FOURNISS@ABC fou_r ON fou_r.PAY_CODE_ID = loc.PAY_CODE_ID_R AND fou_r.FOU_CODE_ID = loc.FOU_CODE_ID_R
LEFT JOIN REF_MOT@ABC mot ON mot.RMR_CODE_ID = cmd_r.RMR_CODE_ID
WHERE
dos.REF_EXT = 'XXXXXXX'
如果我在 SELECT
中评论 fou_r.*
它有效。
以下查询也不起作用:
SELECT *
FROM ... ;
SELECT (SELECT count(xxx) FROM ...)
FROM ...;
我在 SO 上查看了类似的问题,但它们都使用了复杂的查询,或者在 WHERE
中使用了很多 SELECT
。我的很简单,所以我不明白哪里出了问题。
当前数据库: Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - 64bit Production
目标数据库(指db link ABC目标): Oracle Database 10g企业版Release 10.2.0.3.0 - 64bi
客户端: Toad for Oracle 9.7.2.5
您似乎遇到了错误 13589271。我无法分享 MOS 的详细信息,但无论如何也没什么可分享的。它与远程 table 有一个 30 个字符名称的列有关,就像您在远程 FOURNIUSS
table.
中一样
不幸的是,简单地为查询中的列添加了别名,如下所示:
fou_d.COLUMN_WITH_30_CHARACTERS_NAME alias_a,
fou_r.COLUMN_WITH_30_CHARACTERS_NAME alias_b,
... 无济于事,仍然出现相同的错误,因为本地数据库应用了别名,问题似乎出在远程访问期间。似乎有效的是使用内联视图在连接之前应用列别名:
...
LEFT JOIN LOC@ABC loc ON dos.DOS_CODE_ID = loc.DOS_CODE_ID
LEFT JOIN (
SELECT PAY_CODE_ID, FOU_CODE_ID, COLUMN_WITH_30_CHARACTERS_NAME alias_a FROM FOURNISS@ABC
) fou_d ON fou_d.PAY_CODE_ID = loc.PAY_CODE_ID_D AND fou_d.FOU_CODE_ID = loc.FOU_CODE_ID_D
LEFT JOIN (
SELECT PAY_CODE_ID, FOU_CODE_ID, COLUMN_WITH_30_CHARACTERS_NAME alias_b FROM FOURNISS@ABC
) fou_r ON fou_r.PAY_CODE_ID = loc.PAY_CODE_ID_R AND fou_r.FOU_CODE_ID = loc.FOU_CODE_ID_R
LEFT JOIN REF_MOT@ABC mot ON mot.RMR_CODE_ID = cmd_r.RMR_CODE_ID
...
如果您在两个内联视图中为该列指定相同的别名,这甚至会起作用。缺点是您必须明确列出 table 中的所有列(或至少是您感兴趣的列),以便能够将别名应用于有问题的列,但是这样做了仍然可以在外部 select 列表中使用 fou_d.*
和 fou_r.*
。
我没有 11.2.0.2 数据库,但我已 运行 在 11.2.0.3 数据库中成功完成此操作,但仍然显示原始代码中的 ORA-00918 错误。当然,11.2.0.2 中的其他内容可能会阻止此解决方法生效。我根本没有看到 11.2.0.4 中的原始问题,因此升级到该终端补丁版本可能是一个更好的长期解决方案。
无论如何,使用 *
通常被认为是一种不好的做法,尤其是因为您将从连接中获得很多重复的列(每行中有很多 dos_code_id
,因为例子);但是您也可能会得到您并不真正想要的其他数据,并且使用此结果集的任何内容都必须假定列顺序在那些 tables 中始终相同 - 任何变化,或更高版本添加或删除列会导致问题。
当我执行下面的查询时,我收到以下错误消息:
ORA-00918: column ambigously defined
ORA-02063: preceding line from ABC
查询:
SELECT
dos.*,
cmd.*,
cmd_r.*,
adr_inc.*,
adr_veh.*,
loc.*,
fou_d.*,
fou_r.*, --Works if I comment this line
mot.*
FROM
DOSSIERS@ABC dos
LEFT JOIN CMDS@ABC cmd ON cmd.DOS_CODE_ID = dos.dos_code_id
LEFT JOIN CMDS_RECCSTR@ABC cmd_r ON cmd_r.DOS_CODE_ID = dos.DOS_CODE_ID AND cmd_r.CMD_CODE_ID = cmd.CMD_CODE_ID AND cmd_r.CMD_DT_CREAT = cmd.CMD_DT_CREAT
LEFT JOIN HISTO_ADR@ABC adr_inc ON adr_inc.DOS_CODE_ID = dos.DOS_CODE_ID
LEFT JOIN HISTO_ADR@ABC adr_veh ON adr_veh.DOS_CODE_ID = dos.DOS_CODE_ID
LEFT JOIN LOC@ABC loc ON dos.DOS_CODE_ID = loc.DOS_CODE_ID
LEFT JOIN FOURNISS@ABC fou_d ON fou_d.PAY_CODE_ID = loc.PAY_CODE_ID_D AND fou_d.FOU_CODE_ID = loc.FOU_CODE_ID_D
LEFT JOIN FOURNISS@ABC fou_r ON fou_r.PAY_CODE_ID = loc.PAY_CODE_ID_R AND fou_r.FOU_CODE_ID = loc.FOU_CODE_ID_R
LEFT JOIN REF_MOT@ABC mot ON mot.RMR_CODE_ID = cmd_r.RMR_CODE_ID
WHERE
dos.REF_EXT = 'XXXXXXX'
如果我在 SELECT
中评论 fou_r.*
它有效。
以下查询也不起作用:
SELECT *
FROM ... ;
SELECT (SELECT count(xxx) FROM ...)
FROM ...;
我在 SO 上查看了类似的问题,但它们都使用了复杂的查询,或者在 WHERE
中使用了很多 SELECT
。我的很简单,所以我不明白哪里出了问题。
当前数据库: Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - 64bit Production
目标数据库(指db link ABC目标): Oracle Database 10g企业版Release 10.2.0.3.0 - 64bi
客户端: Toad for Oracle 9.7.2.5
您似乎遇到了错误 13589271。我无法分享 MOS 的详细信息,但无论如何也没什么可分享的。它与远程 table 有一个 30 个字符名称的列有关,就像您在远程 FOURNIUSS
table.
不幸的是,简单地为查询中的列添加了别名,如下所示:
fou_d.COLUMN_WITH_30_CHARACTERS_NAME alias_a,
fou_r.COLUMN_WITH_30_CHARACTERS_NAME alias_b,
... 无济于事,仍然出现相同的错误,因为本地数据库应用了别名,问题似乎出在远程访问期间。似乎有效的是使用内联视图在连接之前应用列别名:
...
LEFT JOIN LOC@ABC loc ON dos.DOS_CODE_ID = loc.DOS_CODE_ID
LEFT JOIN (
SELECT PAY_CODE_ID, FOU_CODE_ID, COLUMN_WITH_30_CHARACTERS_NAME alias_a FROM FOURNISS@ABC
) fou_d ON fou_d.PAY_CODE_ID = loc.PAY_CODE_ID_D AND fou_d.FOU_CODE_ID = loc.FOU_CODE_ID_D
LEFT JOIN (
SELECT PAY_CODE_ID, FOU_CODE_ID, COLUMN_WITH_30_CHARACTERS_NAME alias_b FROM FOURNISS@ABC
) fou_r ON fou_r.PAY_CODE_ID = loc.PAY_CODE_ID_R AND fou_r.FOU_CODE_ID = loc.FOU_CODE_ID_R
LEFT JOIN REF_MOT@ABC mot ON mot.RMR_CODE_ID = cmd_r.RMR_CODE_ID
...
如果您在两个内联视图中为该列指定相同的别名,这甚至会起作用。缺点是您必须明确列出 table 中的所有列(或至少是您感兴趣的列),以便能够将别名应用于有问题的列,但是这样做了仍然可以在外部 select 列表中使用 fou_d.*
和 fou_r.*
。
我没有 11.2.0.2 数据库,但我已 运行 在 11.2.0.3 数据库中成功完成此操作,但仍然显示原始代码中的 ORA-00918 错误。当然,11.2.0.2 中的其他内容可能会阻止此解决方法生效。我根本没有看到 11.2.0.4 中的原始问题,因此升级到该终端补丁版本可能是一个更好的长期解决方案。
无论如何,使用 *
通常被认为是一种不好的做法,尤其是因为您将从连接中获得很多重复的列(每行中有很多 dos_code_id
,因为例子);但是您也可能会得到您并不真正想要的其他数据,并且使用此结果集的任何内容都必须假定列顺序在那些 tables 中始终相同 - 任何变化,或更高版本添加或删除列会导致问题。