Perché non Oracle alzare “ORA-00918: colonna ambiguamente definito” per questa query?

Ho appena imbattuto in un comportamento strano in Oracle, dove mi aspetta ORA-00918 di essere sollevato, ma non è così. Prendere questa query, per esempio.

SELECT *
FROM USER_TABLES TAB
JOIN USER_TRIGGERS TRG ON TRG.TABLE_NAME = TAB.TABLE_NAME
WHERE STATUS = 'DISABLED'

Questa query è nominalmente alla ricerca di dettagli di tabelle con i portatori di trigger, ma si prega di notare che questo non è il problema che sto cercando di risolvere. Il problema non è univoco per questa query, il dizionario dei dati, delle opinioni e dei tavoli; per quanto mi riguarda posso dire che si applica a qualsiasi insieme di tabelle o viste (da due o tre che ho provato).

Comunque, provare a eseguire la query e si ottiene ORA-00918 perché sia USER_TABLES e USER_TRIGGERS avere una colonna denominata STATUS in modo da ottenere la query per eseguire la WHERE clausola deve essere cambiato per TRG.STATUS. Ok, fresco, ma cercano di entrare in un’altra tabella.

SELECT *
FROM USER_TABLES TAB
JOIN USER_TRIGGERS TRG ON TRG.TABLE_NAME = TAB.TABLE_NAME
JOIN USER_CONSTRAINTS CON ON CON.TABLE_NAME = TAB.TABLE_NAME
WHERE STATUS = 'DISABLED'

Questa query, senza qualifica che colonna STATO è media, magicamente funziona!!! Non importa la semantica o ciò che la query restituisce, non c’è alcun errore. USER_CONSTRAINTS ha anche una colonna denominata STATUS troppo, così come fa a non sapere che cosa fare quando ci sono due colonne di scegliere, ma va bene anche più ambiguità?

Questo è tutto sul 10.2.0.3.0, e in sostanza ORA-00918 smette di essere sollevato se si dispone di più di due tabelle nella query. Se questo è un Oracolo bug, qualcuno sa per quando è stato fissato e in modo che Oracle versione è probabilmente a causa di cowboy query di saltare se il nostro database viene aggiornato?

Aggiornamento

Grazie per BQ per dimostrare il bug è stato risolto in 11.2.0.1.0. Taglia per chiunque in grado di mostrare risolto in una versione precedente!

  • molto buona domanda, infatti, è possibile select distinct status per la seconda query, e select distinct tab.status e si ottengono risultati diversi.
  • Vedo lo stesso comportamento 9.2.0.8.0 e 10.2.0.4.0
  • Sono stato colpito da questo problema prima. Non poteva lavorare perché una colonna chiave ora aveva null dopo l’esterna di unirsi a un altro tavolo. Bello vedere che non sono l’unica!!! E felice di vedere che è fisso in 11g.
InformationsquelleAutor batwad | 2010-11-24

 

5 Replies
  1. 8

    Può dire quando è stato risolto, ma ecco i miei risultati:

    Connected to:
    Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
    With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP,
    Data Mining and Real Application Testing options
    
    SQL> SELECT *
      2  FROM USER_TABLES TAB
      3  JOIN USER_TRIGGERS TRG ON TRG.TABLE_NAME = TAB.TABLE_NAME
      4  WHERE STATUS = 'DISABLED';
    WHERE STATUS = 'DISABLED'
          *
    ERROR at line 4:
    ORA-00918: column ambiguously defined
    
    SQL> ed
    Wrote file afiedt.buf
    
      1  SELECT *
      2  FROM USER_TABLES TAB
      3  JOIN USER_TRIGGERS TRG ON TRG.TABLE_NAME = TAB.TABLE_NAME
      4  JOIN USER_CONSTRAINTS CON ON CON.TABLE_NAME = TAB.TABLE_NAME
      5* WHERE STATUS = 'DISABLED'
    SQL> /
    WHERE STATUS = 'DISABLED'
          *
    ERROR at line 5:
    ORA-00918: column ambiguously defined
    • Penso che si potrebbe aver letto male la domanda. Che uno genera l’errore, ma quando si aggiunge USER_CONSTRAINTS non
    • Ho fatto perdere, ma ho modificato la mia risposta per dimostrare che sono effettivamente ottenere l’ORA-00918 per entrambe le query.
    • Beh, è bello sapere che lo ha fatto avere la fissa
  2. 13

    Cercato il Supporto di Oracle e ho trovato questo:

    Bug 5368296 – ANSI SQL join può non segnalare ORA-918 ambiguo, colonna [ID 5368296.8]

    Versioni confermato di essere colpito:

    • 10.2.0.3
    • 10.2.0.4

    Questo problema è stato risolto in

    • 10.2.0.4 Patch 2 su Piattaforme Windows
    • 10.2.0.5 (Server Set Di Patch)
    • 11.1.0.6 (Versione Base)

    Distacco non di più, poiché è necessario un Supporto di Oracle account per visualizzare i dettagli, ma il pensiero Oracle numero di Bug/versioni interessate sarebbe bene condividere a punto nella giusta direzione sul Supporto di Oracle.

    • Bella BQ, che è proprio quello che cercavo. Molte grazie!
  3. 2

    Si utilizza SQL ANSI. Sto indovinando che associa lo STATO in cui la clausola con la guida di tabella.

    Quando si utilizza “oracle” sintassi potrete vedere il comportamento atteso.

    SELECT *
    FROM USER_TABLES TAB, USER_TRIGGERS TRG, USER_CONSTRAINTS CON
    WHERE TRG.TABLE_NAME = TAB.TABLE_NAME
    AND CON.TABLE_NAME = TAB.TABLE_NAME
    AND STATUS = 'DISABLED'
    • Piuttosto che ANSI e Oracle sintassi, è possibile fare riferimento a loro come ANSI 89 e ANSI 92 dal momento che entrambi sono ANSI.
    • yup. Si sono corretti.
  4. 0

    Bene, se ho provate su 11.2.0.2.0, ho lo stesso problema. Indipendentemente dalle funzionalità, se si aggiunge un po ‘ di sinistra e di destra si unisce, questo bug non sembra essere fissato a tutti!

    SELECT *
    FROM USER_TABLES TAB
    LEFT JOIN USER_TRIGGERS TRG ON TRG.TABLE_NAME = TAB.TABLE_NAME
    RIGHT JOIN USER_CONSTRAINTS CON ON CON.TABLE_NAME = TAB.TABLE_NAME
    WHERE STATUS = 'DISABLED'

Lascia un commento