我正在尝试从登台表(cust_reg_dim_stg)到仓库表(dim_cust_reg)执行增量插入。这是我正在使用的查询。
insert into dim_cust_reg WITH(TABLOCK)
(
channel_id
,cust_reg_id
,cust_id
,status
,date_created
,date_activated
,date_archived
,custodian_id
,reg_type_id
,reg_flags
,acc_name
,acc_number
,sr_id
,sr_type
,as_of_date
,ins_timestamp
)
select channel_id
,cust_reg_id
,cust_id
,status
,date_created
,date_activated
,date_archived
,reg_type_id
,reg_flags
,acc_name
,acc_number
,sr_id
,sr_type
,as_of_date
,getdate() ins_timestamp
from umpdwstg..cust_reg_dim_stg stg with(nolock)
join lookup_channel ch with(nolock) on stg.channel_name = ch.channel_name
where not exists
(select * from dim_cust_reg dest
where dest.cust_reg_id=stg.cust_reg_id
and dest.sr_id=stg.sr_id
and dest.channel_id=ch.channel_id )
此处,临时表中没有channel_id,而是使用频道查找表(lookup_channel)。运行此查询时,我收到以下错误。
Violation of PRIMARY KEY constraint 'PK__dim_cust__4A293521A789A5FA'.
Cannot insert duplicate key in object 'dbo.dim_cust_reg'.
查询有什么问题? channel_id,sr_id和cust_reg_id形成唯一的密钥组合。似乎没有数据错误。
答案 0 :(得分:1)
您需要在两个方面进行故障排除: -
在下面的代码中:
join lookup_channel ch with(nolock) on stg.channel_name = ch.channel_name
与目标维度中的记录相比,登台表中的传入channel_name可能具有不同的通道名称。
OR 可能是因为NOT EXISTS条件中的这个连接条件:
and dest.sr_id=stg.sr_id
and dest.channel_id=ch.channel_id
此处,当您将暂存数据与目标数据进行比较时,传入的channel_id可能会有所不同。因此,建议一次忽略频道ID并尝试进行故障排除。一旦将这些数据加载到目标中,您就可以确切地知道错误是否是因为channel_id。
快乐排除故障!
答案 1 :(得分:0)
如果表中已存在重复的条目--custr_regr_dim_stg - 则SELECT查询将生成这两个记录,并尝试将其插入到dim_cust_reg表中。所以在SELECT语句中使用DISTINCT。