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,但我可以使用行号轻松插入它。我补充了答案,但非常感谢。