为什么我不能加入 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_nametable_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 种方式查看:

  1. 找到一个系统table,该系统可以访问计算节点并且具有您需要的信息。据我所知,没有这样的系统 table 具有列名。我可能是错的,因为我没有全部搜索。这将是最简单的解决方案,但我认为不存在路径。如果你找到了请告诉我。
  2. 使用系统 table 信息创建一个用户 table 以便在您的查询中使用。这就是上面链接的答案。有两种方法可以做到这一点 1) 从 Redshift 中读取系统 table 信息(卸载?),然后将其加载回正常的 table(复制)或 2)读取系统 table 信息放入游标,然后读取游标并将数据放入正常的 table (链接答案中的代码段)。两条路径都不是超快的,带有复制系统信息的正常 table 只会与上次创建时一样最新。一旦您在正常 table 中获得系统 table 信息,您就可以在任何和所有查询中使用它。
  3. 将数据库管理查询从 Redshift 转移到其他层(Lambda?)。 Redshift 并非像其他数据库那样被设计成一个包罗万象的操作环境。它旨在对最大的数据集执行最困难的分析查询。当您遇到更复杂的数据库管理例程(获取此查询的结果并应用一些数据库更改)时,这种方法会奏效。但这并没有让您在 Redshift 中查询 运行,只是一个更大的想法。

我建议您考虑 #3(long-term 图片),但您可能只需要尽快让它工作。如果有人知道一个系统 table 具有可用于计算节点的列和 table 以及架构名称,那么很多人都会感兴趣,但我不会花很多时间沿着这条路走下去,因为许多人在你面前。这留下了#2——用你需要的数据创建一个普通的table。如果您了解游标(至少了解一点),那么存储过程就很好,因为您只需要调用该过程,系统数据的正常 table 版本将被重新创建(虽然速度不快)。如果这太多了,那么有一点 SQL 将系统 table 信息卸载到 S3,然后加载(复制)它回来就可以正常工作 - 只需要在 S3 中使用 space您可以在哪里转储文件。

希望对您有所帮助