【问题标题】:how to insert random records without violating primary constraint如何在不违反主要约束的情况下插入随机记录
【发布时间】:2014-10-19 00:38:05
【问题描述】:

如果有误导,请原谅我的标题,但我有一张表 tb_partyPRIMARY KEY on party_key

我有以下查询 -

 insert TMS..tb_party
        (
            [party_key]
            ,[party_first_name]
            ,[tax_id]
            ,[party_type_cd]
            ,[citizenship_country_cd]
            ,[domicile_country_cd]
            ,[party_num]
            ,[batch_dt]
        )


    select distinct
            [party_key]
            ,[party_first_name]
            ,[tax_id]
            ,[party_type_cd]
            ,[cit]
            ,[dom]
            ,[party_num]
            ,[batch_dt]

        from 
        (select distinct
                 sca.[party_key]
                ,sca.[party_first_name]
                ,sca.[tax_id]
                ,pt.party_type_cd
                ,tc_cit.COUNTRY_ID as cit
                ,tc_dom.COUNTRY_ID as dom
                ,sca.[party_num]
                ,getdate() as batch_dt
                ,dense_rank() over(partition by sca.[party_key] order by sca.party_key) as rnk
            from Iteration_3.dbo.staging_cust_acct  sca     (nolock)
            join Iteration_3..STG_PARTY_UPLOAD (nolock) stg_party
                on sca.party_key = stg_party.PARTY_KEY
            left join Iteration_3..STG_COUNTRY_ISO              tc_dom  (nolock)
                on sca.[domicile_country] = tc_dom.COUNTRY_NAME
            left join Iteration_3..STG_COUNTRY_ISO              tc_cit  (nolock)
                on sca.[citizenship_country] = tc_cit.COUNTRY_NAME
            left join TMS..tb_party_type                pt      (nolock)
                on sca.[party_type] = pt.party_type_desc
            WHERE  
            SCA.party_type IS NOT NULL
            ) x 
        where rnk = 1

插入失败,因为它试图插入重复的派对密钥,并且由于不同的列在所有列上,它正在获取重复的派对密钥。

我想要什么 - 我想选择 all 不同的party_keys 并在 tb_party 中插入 1 行。其他行可以忽略。这可能吗?

【问题讨论】:

    标签: sql sql-server insert duplicates distinct


    【解决方案1】:

    这就是 row_number 派上用场的地方。

    select distinct
            [party_key]
            ,[party_first_name]
            ,[tax_id]
            ,[party_type_cd]
            ,[cit]
            ,[dom]
            ,[party_num]
            ,[batch_dt]
    
        from 
        (
    
    
            select distinct
                 sca.[party_key]
                ,sca.[party_first_name]
                ,sca.[tax_id]
                ,pt.party_type_cd
                ,tc_cit.COUNTRY_ID as cit
                ,tc_dom.COUNTRY_ID as dom
                ,sca.[party_num]
                ,getdate() as batch_dt
                --,dense_rank() over(partition by sca.[party_key] order by sca.party_key,sca.[tax_id],sca.[party_num],sca.[party_first_name]*/) as rnk
                ,row_number() over (partition by sca.party_key order by sca.party_key) rn
            from Iteration_3.dbo.staging_cust_acct  sca     (nolock)
            join Iteration_3..STG_PARTY_UPLOAD (nolock) stg_party
                on sca.party_key = stg_party.PARTY_KEY
            left join Iteration_3..STG_COUNTRY_ISO              tc_dom  (nolock)
                on sca.[domicile_country] = tc_dom.COUNTRY_NAME
            left join Iteration_3..STG_COUNTRY_ISO              tc_cit  (nolock)
                on sca.[citizenship_country] = tc_cit.COUNTRY_NAME
            left join TMS..tb_party_type                pt      (nolock)
                on sca.[party_type] = pt.party_type_desc
            WHERE --SCA.update_source  = 'ECM' AND SCA.update_dt = @ECM_MAX_DATE
            --and 
            SCA.party_type IS NOT NULL
            ) x 
        where rn = 1 
    

    【讨论】:

      【解决方案2】:

      尝试在唯一列上合并到您的目标表中。不匹配时,插入。当像这样匹配更新时: ... 设置 target.[column] = coalesce(source.[column], target.[column]) ... 这样,当您有源值时,您可以更新所有目标列,否则它们保持不变。)

      【讨论】:

      • 感谢@Katherine,但我可以使用 ROW_NUMBER 轻松插入它。我添加了答案,但非常感谢。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多