Sql 如何在不违反主约束的情况下插入随机记录

Sql 如何在不违反主约束的情况下插入随机记录,sql,sql-server,insert,duplicates,distinct,Sql,Sql Server,Insert,Duplicates,Distinct,请原谅我的标题有误导性,但我有一个表tb\u party,party\u KEY上有主键 我有以下疑问- insert TMS..tb_party ( [party_key] ,[party_first_name] ,[tax_id] ,[party_type_cd] ,[citizenship_country_cd] ,[domici

请原谅我的标题有误导性,但我有一个表
tb\u party
,party\u 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
插入失败,因为它正在尝试插入重复的参与方密钥,并且由于distinct在所有列上,所以它正在拾取重复的参与方密钥


我想要的-我想要选择所有不同的party\u键并在tb\u party中插入一行。其他行可以忽略。这是可能的吗?

这是行号派上用场的地方

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 

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

谢谢@Katherine,但我可以使用行号轻松插入它。我补充了答案,但非常感谢。