我刚刚收到一个新的查询错误,但我没有对其进行任何更改。有什么建议吗?谢谢
SQL编译错误:
查看“*********”的定义声明了 115 列,但视图查询生成 117 列。
这是猜测,但听起来您的视图正在使用
select x.*
,其中 *
表示从某个表中获取所有列。
然后,基础表发生变化。 。 。瞧,你可能遇到问题了。
我刚刚收到一个新的查询错误,我没有对其进行任何更改。有什么建议吗?
如果查询开始产生错误,则意味着视图的定义不再“有效/最新”。最有可能的是基础表已被更改。
视图定义不是动态的。 如果基础源被修改以致它们不再与视图定义匹配,特别是在删除列时,视图不会自动更新。例如:
创建引用源表中特定列的视图,随后从表中删除该列。
使用表中的 SELECT * 创建视图,随后从表中删除任何列。
在这两种情况下,查询视图都会返回列不匹配错误。
重现场景的步骤:
CREATE OR REPLACE TABLE t(col1 INT, col2 INT);
INSERT INTO t(col1, col2) VALUES (1,1);
CREATE OR REPLACE VIEW v_t AS SELECT * FROM t;
SELECT * FROM v_t;
--COL1 COL2
--1 1
到目前为止一切顺利。现在通过添加新列来更改基础表:
ALTER TABLE t ADD COLUMN col3 INT DEFAULT 3;
SELECT * FROM v_t;
SQL 编译错误:“V_T”的视图定义声明了 2 列,但视图查询生成了 3 列。
重新创建视图并使其定义与基础表保持一致应该可以解决该问题:
CREATE OR REPLACE VIEW v_t
COPY GRANTS
AS
SELECT * FROM t;
-- using * will work to refresh it but I would not recommend it
-- and explicitly describe columns instead
CREATE OR REPLACE VIEW v_t
COPY GRANTS -- to preserve already granted permissions
AS
SELECT col1, col2, col3 FROM t;
SELECT * FROM v_t;
-- COL1 COL2 COL3
-- 1 1 3
今天早上我发现自己也遇到了类似的问题。我从我拥有的 txt 文件中复制了查询并将其粘贴到工作表中,但厌倦了运行它并得到了相同的错误。我使用了带有定义问题的表进行连接,并且仅用于 1 列,所以我不明白为什么它会给我这样的错误。
我在工作表上评论了我看到的错误的所有检查表。但我决定再次运行它,它成功了。
这告诉我 Snowflake 正在使用它缓存的内容,但在编辑查询后,它会将其视为新查询并重新运行它,而不是在缓存中的内容与定义不匹配时出错。
CREATE OR REPLACE VIEW v_t
COPY GRANTS
AS
SELECT * FROM t;
运行上述命令后,如果我在源表中创建一个新列并运行 select * from v_t ,它会因“查询生成 Y 列但仅声明 X”而中断
有人解决这个问题了吗?无法对列名称进行硬编码,因为我的情况下的基础表是动态的。我无法在每次表更新其 DDL 时重新创建视图。