Classe de erro TABLE_OR_VIEW_NOT_FOUND

SQLSTATE: 42P01

Não foi possível encontrar a tabela ou a exibição <relationName>. Verifique a ortografia e a correção do esquema e do catálogo.

Se você não qualificou o nome com um esquema, verifique a saída current_schema() ou qualifique o nome com o esquema e o catálogo corretos.

Para tolerar o erro na lista suspensa, use DROP VIEW IF EXISTS ou DROP TABLE IF EXISTS.

Parâmetros

  • relationName: o nome da relação especificada (tabela ou exibição) que não pode ser encontrada.

Explicação

Tabelas e exibições persistentes são compostas por três partes de nome: <catalog>.<schema>.<relation>. Se você não especificar todas as três partes do nome, ele será completado implicitamente usando o catálogo atual ou o esquema atual. Isso é semelhante à maneira como o diretório de trabalho do sistema de arquivos influencia quais arquivos você pode ver, a menos que você especifique completamente o caminho.

Exibições temporárias ou CTEs (expressões de tabela comuns) só existem dentro da sessão ou da consulta e nunca devem ser qualificadas.

Os motivos mais comuns para não encontrar uma tabela ou exibição são:

  • O objeto simplesmente não existe.
  • O nome do objeto, o esquema ou o catálogo foi escrito incorretamente.
  • O objeto não está localizado no esquema atual.
  • O usuário não tem acesso ao objeto e, portanto, não pode vê-lo.

Atenuação

A mitigação do erro depende da causa:

  • Você digitou o nome da tabela ou exibição, do esquema ou do catálogo incorretamente?

    Corrija a ortografia.

  • Você não qualificou totalmente o nome e o resultado de VALUES current_schema() não corresponde ao nome qualificado da tabela ou da exibição?

    Qualifique explicitamente o relationName com seu esquema e catálogo ou emita um comando USE SCHEMA para definir o esquema implícito desejado.

  • Você fez referência a uma exibição temporária, mas ela estava em uma sessão anterior, expirada ou diferente?

    Recrie a exibição temporária usando CREATE TEMPORARY VIEW <relationName> … ou alterne para o uso de uma exibição permanente.

  • Você fez referência a uma CTE (expressão de tabela comum), mas ela está fora do escopo?

    Mova a definição do CTE para a consulta mais externa. Esse é o início da instrução, portanto, é visível em todos os lugares dentro da instrução.

  • Deseja emitir uma instrução DDL, como ‘DROP TABLE’, caso o objeto exista?

    Emita a instrução usando a cláusula IF EXISTS, como: DROP TABLE <relationName> IF EXISTS.

  • Você sabe que o objeto existe, mas não pode vê-lo em SHOW TABLE?

    Entre em contato com o administrador para obter acesso à tabela concedida. Isso também pode precisar incluir acesso ao esquema e ao catálogo.

  • Não está claro por que você não pode resolver a tabela ou a exibição?

    Consulte Resolução de tabela e exibição para obter uma descrição detalhada da resolução de nomes.

Exemplos

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