为什么我不能加入 information_schema.columns 以获取我的表的列列表? - 红移 SQL
Why can't I join to information_schema.columns to get column list for my tables? - Redshift SQL
我有一个名为 relevant_tables
的 table,类似于:
schema_name table_name
AAA AA
AAA AB
AAA AC
BBB BA
我遇到了 information_schema.columns
table 如果我指定 WHERE table_name = 'my_table' AND table_schema = 'my_schema'
.
这将允许我获取 table 的列列表
我想在我的 relevant_tables
table 中获取所有 table 的所有列,如以下预期输出所示:
schema_name table_name column_name
AAA AA A
AAA AA B
AAA AA C
AAA AB A
AAA AC A
BBB BA A
所以我尝试加入schema_name
和table_name
如下:
SELECT
c.table_schema,
c.table_name,
column_name
FROM information_schema.columns c
JOIN relevant_tables r
ON c.table_schema = r.schema_name
AND c.table_name = r.table_name
但是,我收到以下错误:
[0A000] ERROR: Specified types or functions (one per INFO message) not supported on Redshift tables.
为什么会出现此错误以及如何实现预期输出?
当计算节点(用于您的连接)中需要 leader-only 数据时,会发生此错误。没有查询以这种方式进行的路径。可能有一个等效的计算节点 table 或者您可以从游标读取信息,例如 - How to join System tables or Information Schema tables with User defined tables in Redshift
更新/更多细节:
让我试着更清楚地说明您可以如何解决此问题。我可以通过 3 种方式查看:
- 找到一个系统table,该系统可以访问计算节点并且具有您需要的信息。据我所知,没有这样的系统 table 具有列名。我可能是错的,因为我没有全部搜索。这将是最简单的解决方案,但我认为不存在路径。如果你找到了请告诉我。
- 使用系统 table 信息创建一个用户 table 以便在您的查询中使用。这就是上面链接的答案。有两种方法可以做到这一点 1) 从 Redshift 中读取系统 table 信息(卸载?),然后将其加载回正常的 table(复制)或 2)读取系统 table 信息放入游标,然后读取游标并将数据放入正常的 table (链接答案中的代码段)。两条路径都不是超快的,带有复制系统信息的正常 table 只会与上次创建时一样最新。一旦您在正常 table 中获得系统 table 信息,您就可以在任何和所有查询中使用它。
- 将数据库管理查询从 Redshift 转移到其他层(Lambda?)。 Redshift 并非像其他数据库那样被设计成一个包罗万象的操作环境。它旨在对最大的数据集执行最困难的分析查询。当您遇到更复杂的数据库管理例程(获取此查询的结果并应用一些数据库更改)时,这种方法会奏效。但这并没有让您在 Redshift 中查询 运行,只是一个更大的想法。
我建议您考虑 #3(long-term 图片),但您可能只需要尽快让它工作。如果有人知道一个系统 table 具有可用于计算节点的列和 table 以及架构名称,那么很多人都会感兴趣,但我不会花很多时间沿着这条路走下去,因为许多人在你面前。这留下了#2——用你需要的数据创建一个普通的table。如果您了解游标(至少了解一点),那么存储过程就很好,因为您只需要调用该过程,系统数据的正常 table 版本将被重新创建(虽然速度不快)。如果这太多了,那么有一点 SQL 将系统 table 信息卸载到 S3,然后加载(复制)它回来就可以正常工作 - 只需要在 S3 中使用 space您可以在哪里转储文件。
希望对您有所帮助
我有一个名为 relevant_tables
的 table,类似于:
schema_name table_name
AAA AA
AAA AB
AAA AC
BBB BA
我遇到了 information_schema.columns
table 如果我指定 WHERE table_name = 'my_table' AND table_schema = 'my_schema'
.
我想在我的 relevant_tables
table 中获取所有 table 的所有列,如以下预期输出所示:
schema_name table_name column_name
AAA AA A
AAA AA B
AAA AA C
AAA AB A
AAA AC A
BBB BA A
所以我尝试加入schema_name
和table_name
如下:
SELECT
c.table_schema,
c.table_name,
column_name
FROM information_schema.columns c
JOIN relevant_tables r
ON c.table_schema = r.schema_name
AND c.table_name = r.table_name
但是,我收到以下错误:
[0A000] ERROR: Specified types or functions (one per INFO message) not supported on Redshift tables.
为什么会出现此错误以及如何实现预期输出?
当计算节点(用于您的连接)中需要 leader-only 数据时,会发生此错误。没有查询以这种方式进行的路径。可能有一个等效的计算节点 table 或者您可以从游标读取信息,例如 - How to join System tables or Information Schema tables with User defined tables in Redshift
更新/更多细节:
让我试着更清楚地说明您可以如何解决此问题。我可以通过 3 种方式查看:
- 找到一个系统table,该系统可以访问计算节点并且具有您需要的信息。据我所知,没有这样的系统 table 具有列名。我可能是错的,因为我没有全部搜索。这将是最简单的解决方案,但我认为不存在路径。如果你找到了请告诉我。
- 使用系统 table 信息创建一个用户 table 以便在您的查询中使用。这就是上面链接的答案。有两种方法可以做到这一点 1) 从 Redshift 中读取系统 table 信息(卸载?),然后将其加载回正常的 table(复制)或 2)读取系统 table 信息放入游标,然后读取游标并将数据放入正常的 table (链接答案中的代码段)。两条路径都不是超快的,带有复制系统信息的正常 table 只会与上次创建时一样最新。一旦您在正常 table 中获得系统 table 信息,您就可以在任何和所有查询中使用它。
- 将数据库管理查询从 Redshift 转移到其他层(Lambda?)。 Redshift 并非像其他数据库那样被设计成一个包罗万象的操作环境。它旨在对最大的数据集执行最困难的分析查询。当您遇到更复杂的数据库管理例程(获取此查询的结果并应用一些数据库更改)时,这种方法会奏效。但这并没有让您在 Redshift 中查询 运行,只是一个更大的想法。
我建议您考虑 #3(long-term 图片),但您可能只需要尽快让它工作。如果有人知道一个系统 table 具有可用于计算节点的列和 table 以及架构名称,那么很多人都会感兴趣,但我不会花很多时间沿着这条路走下去,因为许多人在你面前。这留下了#2——用你需要的数据创建一个普通的table。如果您了解游标(至少了解一点),那么存储过程就很好,因为您只需要调用该过程,系统数据的正常 table 版本将被重新创建(虽然速度不快)。如果这太多了,那么有一点 SQL 将系统 table 信息卸载到 S3,然后加载(复制)它回来就可以正常工作 - 只需要在 S3 中使用 space您可以在哪里转储文件。
希望对您有所帮助