0

我正在尝试开发一个查询以仅返回非重复记录,以便我可以将这些记录添加到我的数据库中,但我不断收到此错误:

消息 2627,级别 14,状态 1,第 1 行
违反主键约束“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 = 的 MeasureId B.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

有点跑题了……

而不是使用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

我认为问题是在将提取到#GOOD_RECORDS3 表中的记录插入到 J5C_MasterMeasures 表时出现的。请确定 J5C_MasterMeasures PRIMARY KEY 是什么。然后打印#GOOD_RECORDS3 记录以查找可能违反J5C_MasterMeasures 主键约束的可能重复项。

希望有帮助,

于 2010-08-24T15:35:40.777 回答
0

首先声明一个用于存储重复详细信息的表

declare @dupetable table(did int, dcount int)

然后声明两个变量,一个用于存储重复记录的总数,一个作为循环计数器:

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 回答