0

データベースにこれらを追加できるように、重複しないレコードを返すクエリを開発しようとしていますが、次のエラーが発生し続けます。

メッセージ 2627、レベル 14、状態 1、行 1
PRIMARY KEY 制約 'PK_j5c_MasterMeasures' の違反。
オブジェクト 'dbo.j5c_MasterMeasures' に重複するキーを挿入できません。
ステートメントは終了されました。

そして、これは私が使用している最新のクエリです:

CREATE TABLE #GOOD_RECORDS3 (STUDENTID VARCHAR(50), MEASUREDATE SMALLDATETIME, 
measurename VARCHAR(100), LabelName VARCHAR(100), score_10 VARCHAR(100))
INSERT INTO #GOOD_RECORDS3
select A.studentid, A.measuredate, B.measurename, B.LabelName, A.score_10 
from [J5C_Measures_Sys] A join [J5C_ListBoxMeasures_Sys] B on 
A.MeasureID = B.MeasureID
where score_10 is not null and score_10 <> '0' 
except
select A.studentid, A.measuredate, B.measurename, B.LabelName, A.score_10
from [J5C_Measures_Sys] A join [J5C_ListBoxMeasures_Sys] B on 
A.MeasureID = B.MeasureID
where score_10 is not null and score_10 <> '0'
GROUP BY A.studentid, A.measuredate, B.measurename, B.LabelName, A.score_10
having COUNT(A.score_10) > 1

delete #GOOD_RECORDS3
from #GOOD_RECORDS3 a
join sysobjects so on so.name = 'J5C_Measures_Sys' AND so.type = 'u'
join syscolumns sc on so.id = sc.id and sc.name = 'score_10'
join [J5C_MeasureNamesV2_Sys] v on v.Score_field_id = sc.name
WHERE A.SCORE_10 IS NOT NULL AND A.STUDENTID IS NOT NULL AND 
A.MEASUREID IS NOT NULL
and exists (select 1 from J5C_MasterMeasures M
 where M.StudentID = A.StudentID
and M.MeasureID = A.MeasureID)

Insert into J5C_MasterMeasures (studentid, measuredate, measureid, nce)
select A.studentid, A.measuredate, a.MEASUREID, A.score_10
from #GOOD_RECORDS3 a
join sysobjects so on so.name = 'J5C_Measures_Sys' AND so.type = 'u'
join syscolumns sc on so.id = sc.id and sc.name = 'score_10'
join [J5C_MeasureNamesV2_Sys] v on v.Score_field_id = sc.name
WHERE A.SCORE_10 IS NOT NULL AND A.STUDENTID IS NOT NULL AND 
A.MEASUREID IS NOT NULL

これに関する紛らわしい部分は、 M5C_Measures_Sys = からの MeasureIdB.measurename + ' ' + B.Labelnameです。これは からのサンプル データです#GOOD_RECORDS3

1   2006-03-01 00:00:00 ISAT Reading ISAT Reading   564
10005   2003-11-17 00:00:00 TerraNova Reading TerraNova Reading     19
10005   2003-11-17 00:00:00 TerraNova Science TerraNova Science     26
10005   2003-11-17 00:00:00 TerraNova Total Battery TerraNova Total Battery     22
10005   2003-11-17 00:00:00 TerraNova Total Language TerraNova Total Language   43

だからあなたはそれを見ることができますb.measurename = b.labelname。上記のエラーは挿入時に発生します。

以下の回答クエリの結果:

1   2006-03-01 00:00:00 ISAT Reading    ISAT Reading    564
10005   2003-11-17 00:00:00 TerraNova Reading   TerraNova Reading   19
10005   2003-11-17 00:00:00 TerraNova Science   TerraNova Science   26
10005   2003-11-17 00:00:00 TerraNova Total Battery TerraNova Total Battery     22
10005   2003-11-17 00:00:00 TerraNova Total Language    TerraNova Total Language    43
4

3 に答える 3

0

#GOOD_RECORDS3 テーブルにフェッチされたレコードを J5C_MasterMeasures テーブルに挿入するときに問題が発生すると思います。J5C_MasterMeasures PRIMARY KEY が何であるかを確認してください。次に #GOOD_RECORDS3 レコードを出力して、J5C_MasterMeasures 主キー制約に違反する可能性のある重複を探します。

それが役立つことを願って、

于 2010-08-24T15:35:40.777 に答える
0

ちょっと話題が逸れました…

使用する代わりに、次のCREATE TABLE #GOOD_RECORDS3ことができますDECLARE @Good_Records3 TABLE (FieldDefinition...).

主キーが列measureidにある場合は、クエリから返された ID が重複しています。

クエリは何をしますか

select A.studentid, A.measuredate, a.MEASUREID, A.score_10 
from #GOOD_RECORDS3 a 
join sysobjects so on so.name = 'J5C_Measures_Sys' AND so.type = 'u' 
join syscolumns sc on so.id = sc.id and sc.name = 'score_10' 
join [J5C_MeasureNamesV2_Sys] v on v.Score_field_id = sc.name 
WHERE A.SCORE_10 IS NOT NULL AND A.STUDENTID IS NOT NULL AND A.MEASUREID IS NOT NULL 

戻る?重複していませんMEASUREID-valuesか?

于 2010-08-24T15:30:34.773 に答える
0

最初に、重複する詳細を格納するためのテーブルを宣言します

declare @dupetable table(did int, dcount int)

次に、2 つの変数を宣言します。1 つは重複のあるレコードの総数を格納するためのもので、もう 1 つはループ カウンターとしてのものです。

declare @dupecount int, @loopcounter int

次に、重複のあるレコードのリストとそれぞれの重複の数を重複テーブルに入力します。

insert into @dupetable  --Populate duplicate table
(did, dcount)
select id, COUNT(*)
from #GOOD_RECORDS3  
group by id                 --Replace ID with whatever the primary key is
having COUNT(*) > 1

次に、重複のあるレコードの総数を取得します。

select @dupecount = COUNT(*)    
from @dupetable  

次に、ループ カウンターを初期化します。

set @loopcounter = 0

次に、コードは重複のテーブルをループして、最上位のレコードを選択し、その重複エントリをすべて削除してから、一時的な @dupetable から削除します。

while  @loopcounter < @dupecount   --Loop through duplicate records
begin
select * from @dupetable 
set @loopcounter = @loopcounter  + 1    --Increase the counter by 1
Declare @ldid int, @ldcount int         --Declare variables for storing the duplicate id and the number of dupes
select top 1 @ldid = did, @ldcount = dcount  --Populate those variables
from @dupetable 
delete from @dupetable      --Remove record from dupe table
where did = @ldid 
declare @rcval int      --Declare variable for setting rowcount
set @rcval = @ldcount - 1   --Set the rowcount val to the number of duplicate rows -1
set rowcount  @rcval        --Set the rowcount val to the number of duplicate rows -1
delete from @testtbl        --Delete the duplicate records from the table
where id = @ldid
end     --End loop

あまりエレガントではありませんが、うまくいくと思います。

于 2010-08-24T16:27:26.553 に答える