Snowflake SQL 编译错误:查看声明的定义但查看生成的查询

问题描述 投票:0回答:4

我刚刚收到一个新的查询错误,但我没有对其进行任何更改。有什么建议吗?谢谢

SQL编译错误:

查看“*********”的定义声明了 115 列,但视图查询生成 117 列。

sql snowflake-cloud-data-platform
4个回答
6
投票

这是猜测,但听起来您的视图正在使用

select x.*
,其中
*
表示从某个表中获取所有列。

然后,基础表发生变化。 。 。瞧,你可能遇到问题了。


2
投票

我刚刚收到一个新的查询错误,我没有对其进行任何更改。有什么建议吗?

如果查询开始产生错误,则意味着视图的定义不再“有效/最新”。最有可能的是基础表已被更改。

创建视图

视图定义不是动态的如果基础源被修改以致它们不再与视图定义匹配,特别是在删除列时,视图不会自动更新。例如:

  • 创建引用源表中特定列的视图,随后从表中删除该列。

  • 使用表中的 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

0
投票

今天早上我发现自己也遇到了类似的问题。我从我拥有的 txt 文件中复制了查询并将其粘贴到工作表中,但厌倦了运行它并得到了相同的错误。我使用了带有定义问题的表进行连接,并且仅用于 1 列,所以我不明白为什么它会给我这样的错误。

我在工作表上评论了我看到的错误的所有检查表。但我决定再次运行它,它成功了。

这告诉我 Snowflake 正在使用它缓存的内容,但在编辑查询后,它会将其视为新查询并重新运行它,而不是在缓存中的内容与定义不匹配时出错。


0
投票
CREATE OR REPLACE VIEW v_t 
COPY GRANTS 
AS 
SELECT * FROM t;

运行上述命令后,如果我在源表中创建一个新列并运行 select * from v_t ,它会因“查询生成 Y 列但仅声明 X”而中断

有人解决这个问题了吗?无法对列名称进行硬编码,因为我的情况下的基础表是动态的。我无法在每次表更新其 DDL 时重新创建视图。

© www.soinside.com 2019 - 2024. All rights reserved.