【问题标题】:Insert without creating duplicates插入而不创建重复项
【发布时间】:2021-12-28 17:21:05
【问题描述】:

如何将一个表中的唯一数据加载到另一个表中?例如,如果我在两个表中都有列 - patient_idnpidiagnosis_codefrom_dateto_date 等,我如何确保在插入时不会在 table 1 中创建重复记录来自table 2 发生。

在 PostgreSQL 中,我可以在这些列上创建唯一索引,但 Snowflake 不支持。

【问题讨论】:

    标签: snowflake-cloud-data-platform sql-insert


    【解决方案1】:

    使用 INSERT INTO SELECT EXCEPT:

    INSERT INTO table_1(patient_id, npi, diagnosis_code, from_date, to_date)
    SELECT patient_id, npi, diagnosis_code, from_date, to_date
    FROM table_2
    EXCEPT
    SELECT patient_id, npi, diagnosis_code, from_date, to_date
    FROM table_1;
    

    【讨论】:

      【解决方案2】:

      另一种解决方案是您可以将MERGEWHEN NOT MATCHED THEN INSERT 子句一起使用:

      merge into table_1 AS t1 using table_2 AS t2
          ON t1.patient_id = t2.patient_id 
              AND t1.npi= t2.npi 
              AND t1.diagnosis_code= t2.diagnosis_code
              AND t1.from_date= t2.from_date 
              AND t1.to_date = t2.to_date
          when not matched then 
              insert (patient_id, npi, diagnosis_code, from_date, to_date) 
                  values (t2.patient_id,  t2.npi, t2.diagnosis_code, t2.from_date, t2.to_date);
      

      【讨论】:

      • 如何将性能与插入和除外进行比较?它们看起来很相似?
      • @YaakovBressler 他们都应该变成相同的哈希连接逻辑,所以他们应该是相同的速度。但与大多数事情一样,我会在你拥有的桌子上尝试一下,然后看看。如果他们是平等的,我会坚持让你最容易阅读/理解的那个。我倾向于使用 MERGE,因为我喜欢能够用它们做更多的事情..
      【解决方案3】:

      您可以尝试使用 not exists 子句:

      select
          patient_id,
          npi,
          diagnosis_code,
          from_date,
          to_date
      from
          table t1
      where
          not exists (
              select
                  1
              from
                  table t2
              where
                  t1.patient_id = t2.patient_id
                  and t1.npi = t2.npi
                  and t1.diagnosis_code = t2.diagnosis_code
                  and t1.from_date = t2.from_date
          );
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-05-02
        • 2017-11-23
        • 1970-01-01
        • 2012-12-12
        • 2021-06-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多