TABLE_OR_VIEW_NOT_FOUND 错误类

SQLSTATE:42P01

找不到表或视图 <relationName>。 验证架构和目录的拼写和正确性。

如果未使用架构指定名称,请验证current_schema()的输出结果,或使用正确的架构和目录来指定名称。

若要容许删除时出错,请使用 DROP VIEW IF EXISTS 或 DROP TABLE IF EXISTS。

参数

  • relationName:找不到的指定关系(表或视图)的名称。

解释

持久化表和视图由三个名称部分组成:<catalog>.<schema>.<relation>。 如果未指定名称的所有三个部分,则会使用当前目录或当前架构隐式填写名称。 这类似于文件系统的工作目录如何影响你可以看到的文件的方式,除非完全指定路径。

临时视图或公用表表达式(CTE)仅存在于会话或查询中,并且绝不能限定。

找不到表或视图的最常见原因是:

  • 对象根本不存在。
  • 对象名称、架构或目录拼写错误。
  • 对象不在当前架构中。
  • 用户无权访问该对象,因此无法看到该对象。

缓解

错误的缓解取决于原因:

  • 表或视图、架构或目录的名称是否拼写错误?

    更正拼写。

  • 是否未完全限定名称,并且 VALUES current_schema() 的结果与表或视图的限定名称不匹配?

    使用架构和目录显式限定 relationName,或发出 USE SCHEMA 命令以设置所需的隐式架构。

  • 是否引用了在以前的、已过期的或不同会话中的临时视图?

    使用 CREATE TEMPORARY VIEW <relationName> …重新创建临时视图,或切换到使用永久视图。

  • 是否引用了超出了范围的通用表表达式 (CTE)?

    将 CTE 的定义移动到最外部的查询。 这是语句的开头,因此它在语句中的任何地方可见。

  • 是否要执行 DDL 语句,例如“DROP TABLE”,以防万一对象存在?

    使用 IF EXISTS 子句发出语句,例如:DROP TABLE <relationName> IF EXISTS

  • 你知道对象是否存在,但 SHOW TABLE中看不到该对象?

    请与管理员联系,获取对已授予表的访问权限。 这可能需要包括对架构和目录的访问权限。

  • 目前还不清楚为何无法解析表或视图?

    有关名称解析的详细说明,请参阅表和视图解析

例子

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