我收到主键违规,我不知道如何解决它。实际的错误信息是;
Msg 2627,Level 14,State 1,Line 1违反PRIMARY KEY 约束'PK_infmtx_dat_Transactions'。无法插入重复键 在对象'dbo.infmtx_dat_Transactions'中。
我的代码如下:
INSERT INTO infmtx_dat_Transactions (tranid,chgid,chgidagnst,incnumagnst,rptpd,aid,claimid
,chgsvcpd,trantype,doschg,doscalpd,postdtchg,postdtchgcalpd,postdttran
,postdttrancalpd,depositdt,depositcalpd,cptid,cptcode,cptcomp,billprov
,rendprov,facid,posid,dptid,priminsmne,priminscatid,transcode,crcat
,refprovid,modalid,units,adjunits,patcnt,enccnt,cptcnt,amt,chgallow
,totworkrvu,totfacrvu,denial,curresponsible,curbal,curinsmne
,curopenbalflag,curcreditbalflag,denyflag,denycode,denydate,feetypeid )
SELECT
trn.tran_id
,trn.chg_id
,chg.chgidagnst
,chg.incnumagnst
,trn.rptpd
,trn.acctid
,chg.claimid
,chg.rptpd
,tcd.trantype
,chg.doschg
,chg.doscalpd
,chg.postdtchg
,chg.postdtchgcalpd
,trn.tranpostdt
,trn.tranpostpd
,trn.pmtdate
,trn.pmtpd
,chg.cptid
,chg.cptcode
,chg.cptcomp
,chg.billprov
,chg.rendprov
,chg.facid
,chg.posid
,chg.dptid
,chg.priminsmne
,chg.priminscatid
,trn.payermne
,tcd.crcat
,chg.refprovid
,chg.modalid
,0
,0
,0
,0
,0
,trn.trnamt
,chg.chgallow
,0
,0
,0
,''
,0
,''
,'N'
,'N'
,'N'
,''
,Null
,chg.feetypeid
FROM tmp_dat_OtherTrans trn
LEFT JOIN infmtx_dat_Transactions chg on trn.chg_id = chg.tranid AND trn.chg_id = chg.chgid
AND trn.chg_id = chg.chgidagnst
LEFT JOIN infmtx_dic_TransCode tcd on trn.payermne = tcd.trancodemne
ORDER BY trn.tran_id;
如何设置查询以查找重复记录
infmtx_dat_Transactions
表上的主键是:tranid,chgid,chgidagnst,rptpd和trantype
答案 0 :(得分:1)
主键(和其他候选键)阻止插入重复值,因此您无法搜索它们。重复项不存在。
相反,在您尝试插入的新数据中找到主键(和其他候选键)值,然后搜索它们。其中一个肯定会复制到您的新数据中,或已经在您的表中。
通过在源表“tmp_dat_OtherTrans”(包括其连接)和“infmtx_dat_Transactions”之间执行内部连接的查询,看起来像,就像您可以识别现有表中的冲突键一样。答案 1 :(得分:0)
WITH duplicate_check AS (
SELECT
*,ROW_NUMBER() OVER(PARTITION BY key_column1,key_column2,key_column3 ORDER BY (SELECT NULL))) AS n
FROM table_with_suspect_data
SELECT
*
FROM duplicate_check
WHERE n > 1
删除除每个副本之外的所有行:
WITH duplicate_check AS (
SELECT
*,ROW_NUMBER() OVER(PARTITION BY key_column1,key_column2,key_column3 ORDER BY (SELECT NULL))) AS n
FROM table_with_suspect_data
DELETE
FROM duplicate_check
WHERE n > 1