如何制定T-SQL以排除重复?

时间:2010-08-24 04:31:37

标签: tsql exists

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

我尝试了您的解决方案,但仍然遇到重复的错误问题。我删除了35行重复。还有什么可能导致这个?这是我的查询。我认为部分混乱是在j5c_MasterMeasures中,measureid是一个列,但是这个值来自j5c_ListBoxMeasures_Sys中的两个字段。

CREATE TABLE #GOOD_RECORDS3 (STUDENTID VARCHAR(50), MEASUREDATE SMALLDATETIME, MEASUREID 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
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
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

1 个答案:

答案 0 :(得分:0)

您没有提到J5C_MasterMeasures上唯一约束的具体细节。因此,我假设所有插入的列都是约束的一部分。此外,使用Except会让我相信您使用的是SQL Server 2005或更高版本。此外,尚不清楚J5C_MeasureNamesV2_Sys的加入如何适合设计或解决方案。

With GoodRecords As
    (
    Select A.StudentId
        , A.measuredate
        , B.measurename+ ' ' +B.LabelName
        , A.score_10 As NCE
    From [J5C_Measures_Sys] A 
        Join [J5C_ListBoxMeasures_Sys] B 
            On A.MeasureID = B.MeasureID
    Where A.StudentId Is Not Null
        And A.Score_10 Is Not Null
        And A.MeasureId Is Not Null
    Group By A.StudentId
        , A.MeasureDate
        , B.MeasureName+ ' ' +B.LabelName
        , A.score_10 
    Having Count(A.Score_10) = 0
    )
Insert J5C_MasterMeasures ( StudentId, MeasureData, MeasureId, NCE )
Select GR.StudentId, GR.MeasureData, GR.MeasureId, GR.NCE
From GoodRecords As GR
    Join [J5C_MeasureNamesV2_Sys] v 
        On v.Score_field_id = 'Score_10'
Where Not Exists    (
                    Select 1
                    From J5C_MasterMeasures As J1
                    Where J1.StudentId = GR.StudentId
                        And J1.MeasureData = GR.MeasureData
                        And J1.MeasureId = GR.MeasureId
                        And J1.NCE = GR.NCE
                    )