1

主キー違反が発生しましたが、解決方法がわかりません。実際のエラー メッセージは次のとおりです。

メッセージ 2627、レベル 14、状態 1、行 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_Transactionstranid、chgid、chgidagnst、rptpd、および trantype です。

4

2 に答える 2

1

主キー (およびその他の候補キー)は重複する値の挿入を防ぐため、それらを検索することはできません。重複は存在しません。

代わりに、挿入しようとしている新しいデータで主キー (およびその他の候補キー) の値を見つけて検索します。そのうちの 1 つが確実に新しいデータに複製されているか、既にテーブルに含まれています。

ソーステーブル「tmp_dat_OtherTrans」(その結合を含む)と「infmtx_dat_Transactions」の間の内部結合を使用してクエリを実行することにより、既存のテーブルの競合するキーを特定できるようです

于 2013-07-12T16:35:12.557 に答える
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

重複ごとに 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
于 2013-07-12T16:40:34.407 に答える