Listagg Redshift DDL

Posted

技术标签:

【中文标题】Listagg Redshift DDL【英文标题】: 【发布时间】:2019-02-27 17:00:59 【问题描述】:

我正在尝试检索 Redshift 中表的 DDL。我找到了this 视图,我可以在其中轻松选择任何表的定义。但是我需要一行中的这些信息,并且我知道有这个 Listagg 函数,但是如果我尝试这样做:

select listagg(ddl, ' ')
from admin.v_generate_tbl_ddl
where schemaname = 'schema'
and tablename = 'orders'

它给了我这个错误:

查询执行失败

原因:SQL 错误 [XX000]:错误:一个或多个使用的函数 必须应用于至少一个用户创建的表。用户示例 仅表函数是 LISTAGG、MEDIAN、PERCENTILE_CONT 等

您能帮我解决一下如何实现吗?

【问题讨论】:

我不知道红移,但尝试嵌套在派生表/公用表表达式中:with cte as (select ddl from admin.v_generate_tbl_ddl where schemaname = 'schema' and tablename = 'orders') select listagg(ddl, ' ') from cte 它给了我同样的错误信息。 【参考方案1】:

listagg 函数是一个仅计算节点函数。

但是您运行以获取表 ddl 的查询仅在领导者上运行,因为它仅指定 pg_* 表。

根据 AWS 文档

仅引用目录表(带有 PG 前缀的表,例如 PG_TABLE_DEF)或不引用任何表的查询,仅在领导节点上运行。

如果使用计算节点函数的查询未引用用户定义的表或 Amazon Redshift 系统表,则返回以下错误。

[Amazon] (500310) 无效操作:一个或多个使用的函数必须应用于至少一个用户创建的表。

https://docs.aws.amazon.com/redshift/latest/dg/c_SQL_functions_compute_node_only.html

综上所述,由于您的查询没有引用任何用户创建的表,因此您不能使用listagg

【讨论】:

以上是关于Listagg Redshift DDL的主要内容,如果未能解决你的问题,请参考以下文章

使用 redshift listagg 函数的语法错误

Redshift SQL - 反向 Listagg 函数

如何让我的 Amazon Redshift UDF 接收字符串而不是列表?

用listagg怎么替代这个写法

listagg 函数失败

oracle listagg的 截取长度限制有没有啥方法解决