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;