TABLE_OR_VIEW_NOT_FOUND 错误类
找不到表或视图 <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;