Condividi tramite


classe di errore TABLE_OR_VIEW_NOT_FOUND

SQLSTATE: 42P01

Impossibile trovare la tabella o la vista <relationName>. Verificare l'ortografia e la correttezza dello schema e del catalogo.

Se non hai qualificato il nome con uno schema, verifica l'output di current_schema() o qualifica il nome utilizzando lo schema e il catalogo corretti.

Per tollerare l'errore durante l'eliminazione, utilizzare il comando DROP VIEW IF EXISTS o DROP TABLE IF EXISTS.

Parametri

  • relationName: nome della relazione specificata (tabella o vista) che non è possibile trovare.

Spiegazione

Le tabelle e le viste persistenti si compongono di tre parti del nome ciascuna: <catalog>.<schema>.<relation>. Se non si specificano tutte e tre le parti del nome, queste vengono completate implicitamente usando il catalogo corrente o lo schema corrente. Questo è simile al modo in cui la directory di lavoro del file system influisce sui file visualizzati, a meno che non si specifichi completamente il percorso.

Le viste temporanee o le espressioni di tabella comuni (CTE) esistono solo all'interno della sessione o della query e non devono mai essere qualificate.

Il motivo più comune per cui non è possibile trovare una tabella o una vista sono:

  • L'oggetto semplicemente non esiste.
  • Il nome dell'oggetto, lo schema o il catalogo è stato scritto in modo errato.
  • L'oggetto non si trova nello schema corrente.
  • L'utente non ha accesso all'oggetto e pertanto non può vederlo.

Mitigazione

La mitigazione dell'errore dipende dalla causa:

  • Hai scritto in modo errato il nome della tabella o della vista, dello schema o del catalogo?

    Correggere l'ortografia.

  • Non hai qualificato completamente il nome e il risultato di VALUES current_schema() non corrisponde al nome qualificato della tabella o della vista?

    Qualificare in modo esplicito il relationName con lo schema e il catalogo oppure eseguire un comando USE SCHEMA per impostare lo schema implicito desiderato.

  • Hai fatto riferimento a una visualizzazione temporanea, ma era in una sessione precedente, scaduta o diversa?

    Ricreare la visualizzazione temporanea usando CREATE TEMPORARY VIEW <relationName> …o passare all'uso di una visualizzazione permanente.

  • È stato fatto riferimento a un'espressione di tabella comune (CTE), ma non rientra nell'ambito?

    Spostare la definizione del CTE nella query più esterna. Questo è l'inizio dell'istruzione, quindi è visibile ovunque all'interno dell'istruzione .

  • Eseguire un'istruzione DDL, ad esempio 'DROP TABLE' nel caso in cui l'oggetto esista?

    Emettere l'istruzione usando la clausola IF EXISTS, per esempio: DROP TABLE <relationName> IF EXISTS.

  • Si sa che l'oggetto esiste, ma non è possibile vederlo in SHOW TABLE?

    Contattare l'amministratore per ottenere l'accesso alla tabella concessa. Potrebbe essere necessario includere anche l'accesso allo schema e al catalogo.

  • Non è chiaro perché non è possibile risolvere la tabella o la vista?

    Fai riferimento alla tabella e alla risoluzione per una descrizione dettagliata della risoluzione dei nomi.

Esempi

-- The table is located in othercat.someschema
> SELECT count(*) FROM t;
 [TABLE_OR_VIEW_NOT_FOUND] The table or view `t` cannot be found.

> VALUES current_schema();
 default

-- Change the current schema
> USE SCHEMA othercat.someschema;
> SELECT count(*) FROM T;
 1

-- Alternatively qualify the table
> SELECT count(*) FROM othercat.someschema.t;
 1

-- A reference to a CTE in the wrong scope:
> SELECT count(1) FROM (WITH v(c1) AS (VALUES (1)) VALUES(2)) AS t(c1), v;
 [TABLE_OR_VIEW_NOT_FOUND] The table or view `v` cannot be found.

-- Move the CTE to top level
> WITH v(c1) AS (VALUES (1))
  SELECT count(1) FROM VALUES(2) AS t(c1), v;
 1

-- Dropping a non existing view
> DROP VIEW v;
 [TABLE_OR_VIEW_NOT_FOUND] The table or view `v` cannot be found.

> DROP VIEW IF EXISTS v;