【问题标题】:Athena SQL create table from variable number of tablesAthena SQL 从可变数量的表创建表
【发布时间】:2020-06-04 23:44:00
【问题描述】:

我想根据从 SELECT 查询中获得的多个表名创建一个表/视图。
可以从多个已知表中创建一个表,如下所示:

CREATE TABLE new_table AS
SELECT column_1, column_2
FROM clients_1, clients_2, ... clients_n;

要获取表格列表,我可以使用以下内容:

SELECT DISTINCT table_name FROM information_schema.columns WHERE table_name like '%clients_%';

返回:

     table_name
1    clients_1
2    clients_2

如何在 CREATE TABLE FROM 子句中使用表名结果作为列表?

我用 WITH: 尝试过这样的事情:

WITH mytable AS 
  (SELECT DISTINCT table_name FROM information_schema.columns WHERE table_name like '%clients_%')
    CREATE TABLE new_table AS
    SELECT column_1, column_2
    FROM mytable;

但它大多不起作用。
即使是这样,例如不使用 WITH 并选择 * 列 -

CREATE TABLE new_table AS
SELECT *
FROM (SELECT DISTINCT table_name FROM information_schema.columns WHERE
table_name like '%clients_%');

new_table 只是 mytable/nested 查询的副本。

想法?
谢谢!

【问题讨论】:

  • 你说“它几乎不起作用”。什么正在工作,什么没有工作?通常在 SQL 系统中,DDL 命令(如CREATE TABLE)不允许在 DDL 命令中包含SELECT 命令,所以如果你有任何 工作,我会感到惊讶。最坏的情况是,您需要查询表名,然后以编程方式将它们组合成单独发送的CREATE VIEW 命令。
  • @JohnRotenstein 我给出的最后一个例子有效,SELECT * 在 FROM (SELECT) 的结果上。但是生成的表只是 FROM 部分中嵌套选择的输出(表名的表,而不是每个发现的表中的实际列)。我认为您是对的,将其拆分为两个查询/命令会简单得多。
  • 是的,我可以看到最后一个示例将从嵌套查询的 输出 中进行选择,而不是使用嵌套查询中的表的“名称”。这种类型的东西可以在 Amazon Redshift 中作为“构建” Select 语句的存储过程工作,但在 Athena 中就不会那么简单了。

标签: mysql sql parquet amazon-athena


【解决方案1】:

我最终得到了这样的视图:

CREATE OR REPLACE VIEW clients_all AS
  SELECT column_1, column_2 FROM client1
  UNION ALL
  SELECT column_1, column_2 FROM client2

缺点是每当添加新的 client_n 表时,我都必须更新视图, 并明确指定表的名称,而不是从查询中推断它们,
但是我可能不得不将它分成两个查询,即使按照最初的意图创建一个表。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-02
    • 1970-01-01
    • 1970-01-01
    • 2016-01-25
    • 1970-01-01
    相关资源
    最近更新 更多