【问题标题】:How can I write columns from one table based on the order in another?如何根据另一个表中的顺序从一个表中写入列?
【发布时间】:2022-01-05 10:31:23
【问题描述】:

我有两个表要合并,它们来自同一数据源,但我的理解是,在插入 Redshift 时列顺序很重要,它们的排序方式不同。

所以我有表 X 和 Y,如下所示:

表 X:

  • column_a
  • column_b
  • column_c
  • column_d

表 Y:

  • column_c
  • column_a
  • column_b

我想将表 X 中的数据添加到它们的名称/类型匹配的表 Y 中,我会丢失 d 列并不重要。我一直在尝试使用 pg_get_cols 使用表 Y 中的列名列表从表 X 中进行选择,但 this answer 让我认为这是不可能的。

我有大约 200-300 个表对要像这样组合,所以我正在寻找一种解决方案,以避免不得不手动写出那么多次的列!

谢谢

【问题讨论】:

  • 所以问题是当两个表都有很多列但顺序不同时获取公共列名?我想你可以查询像 f.e. 这样的系统视图。 SVV_COLUMNS
  • @LukStorms 是的,就是这样,特别是获取可用于选择匹配列的列表。
  • 可能类似于this,但随后使用了redshift中可用的系统视图。

标签: sql amazon-web-services amazon-redshift


【解决方案1】:

大多数 SQL 语言都支持“联合”查询。 “联合”将数据堆叠在一起,创建更多行类似的数据。例如:

SELECT
  column_a,
  column_b, 
  colulm_c 
FROM TABLE Y
UNION ALL
SELECT
  column_a,
  column_b, 
  colulm_c 
FROM TABLE X

此查询的输出将是两个表中的三列数据。本质上,数据是通过将第一个查询 (TABLE Y) 的结果叠加在第二个查询 (TABLE X) 的结果之上来组合的。

要记住的重要一点是:两个查询的每一列都必须包含兼容的数据类型。

在此处阅读更多信息:https://www.w3schools.com/sql/sql_ref_union.asp

【讨论】:

  • 谢谢迈克尔,对不起,我在最初的帖子中没有提到(我现在会修改它),我正在寻找一种在查询中以编程方式执行此操作的方法,因为大约有 300 个表我必须这样做,所以我尽量避免每次都写出列名。
【解决方案2】:

Postgres 实现信息模式。

尝试玩弄:-

SELECT * FROM INFORMATION_SCHEMA.COLUMNS

您将获得表名、列名、数据类型、是否允许为 NULL、字符类型的长度等。

【讨论】:

  • 谢谢保罗,我已经设法提取列名列表,但我不知道如何使用列表进行选择,我链接到的问题似乎在问这个问题,响应者说这是不可能的,你看到了吗?
猜你喜欢
  • 2020-12-28
  • 2018-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-27
  • 2018-09-15
  • 1970-01-01
  • 2012-08-27
相关资源
最近更新 更多