【问题标题】:Populate snowflake table with default values without selecting default column values from the file data使用默认值填充雪花表,而不从文件数据中选择默认列值
【发布时间】:2021-10-02 01:16:19
【问题描述】:

我正在尝试动态加载表(删除表并加载数据 - 类似于截断和加载)。让我们假设表需要有 4 个字段,ID、Name、SeqNo 和 DtTimeStamp。

正在从只有两个字段(ID 和名称)的外部暂存 csv\text 文件中选择数据。下面的查询给出了许多列不匹配的错误。如何解决这个问题?

创建或替换表 SOMETABLENAME(ID NUMBER(38,0), 名称 VARCHAR(255), SeqNo NUMBER(38,0) NOT NULL AUTOINCREMENT, DtTimeStamp TIMESTAMP_NTZ(9) NOT NULL DEFAULT CURRENT_TIMESTAMP()) AS SELECT A.$1 AS ID, A.$2 AS Name FROM @EXTERNALSTAGE/SOME_FILE.CSV A;

如果您仔细查看上面的 SQL 语句,我的表有两个额外的字段需要为它加载的每一行自动填充。但我无法让它工作?

非常感谢任何建议。

提前致谢! 沙迪亚

【问题讨论】:

    标签: sql amazon-s3 snowflake-cloud-data-platform stage


    【解决方案1】:

    CREATE TABLE … AS SELECT (CTAS)

    CREATE TABLE <table_name> ( <col1_name> , <col2_name> , ... ) AS SELECT ...
    

    指定的列名数必须与查询中的 SELECT 列表项数匹配;列的类型是从查询产生的类型推断出来的。

    要解决它,CTAS 和 INSERT INTO 可以是两个独立的步骤:

    CREATE OR REPLACE TABLE SOMETABLENAME(
        ID NUMBER(38,0),
        Name VARCHAR(255),
        SeqNo NUMBER(38,0) NOT NULL AUTOINCREMENT,
        DtTimeStamp TIMESTAMP_NTZ(9) NOT NULL DEFAULT CURRENT_TIMESTAMP()
    );
    
    -- here INSERT/SELECT have matching column list
    INSERT INTO SOMETABLENAME(ID, Name)
    SELECT A.$1 AS ID, A.$2 AS Name FROM @EXTERNALSTAGE/SOME_FILE.CSV A;
    

    【讨论】:

    • 谢谢!它有效,您能否也分享一下如何在上述查询中使用文件名模式。例如,我试图从看起来像“SOME_FILE”的文件中选择数据。即,INSERT INTO SOMETABLENAME(ID, Name) SELECT A.$1 AS ID, A.$2 AS Name FROM @EXTERNALSTAGE/SOME_FILE*.CSV A;
    • @Sathya 那应该是单独的问题。作为提示,如果您需要从 Stage 中搜索特定扩展,您可以使用 PATTERN => 'regex_pattern' 参数。
    • 肯定会研究的。谢谢
    猜你喜欢
    • 2021-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-26
    • 1970-01-01
    • 2019-01-19
    • 2020-12-13
    • 1970-01-01
    相关资源
    最近更新 更多