簡體   English   中英

ORA-00918:使用DB Link模糊定義了列

[英]ORA-00918: column ambigously defined, using DB Link

當我執行以下查詢時,出現以下錯誤消息:

ORA-00918:列定義不明確

ORA-02063: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企業版11.2.0.2.0版-64位生產

目標數據庫(指數據庫鏈接ABC目標): Oracle數據庫10g企業版10.2.0.3.0-64bi

客戶端: Toad for Oracle 9.7.2.5

您似乎遇到了錯誤13589271。我無法共享MOS的詳細信息,但是無論如何,共享的內容不多。 它與遠程表有關,盡管該遠程表具有一列包含30個字符的名稱,就像在遠程FOURNIUSS表中一樣。

不幸的是,只是為查詢中的列添加別名,如下所示:

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
...

如果您在兩個內聯視圖中為該列賦予相同的別名,這甚至可以工作。 缺點是您必須顯式列出表中的所有列(或至少是您感興趣的列),以便能夠將別名應用於有問題的列,但是這樣做仍然可以使用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 ); 但您也可能會獲得您實際上不想要的其他數據,並且消耗此結果集的所有數據都必須假定這些表中的列順序始終相同-可能有任何變體,或者以后添加或刪除了專欄,會引起問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM