2010-08-24 2 views
-1

중복되지 않은 레코드를 반환하여 데이터베이스에 추가 할 수 있도록 쿼리를 개발하려고하지만 중복 레코드 오류가 계속 발생합니다.중복을 제외하도록 T-SQL을 공식화하는 방법은 무엇입니까?

해결책을 시도했지만 여전히 중복 오류가 발생합니다. 중복 된 35 개의 행을 삭제했습니다. 그 밖의 무엇이 이것을 일으킬 수 있습니까? 여기 내 쿼리입니다. 제 생각에 혼동의 일부는 measureid가 j5c_MasterMeasures의 단일 열이지만이 값은 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 

답변

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 
        ) 
+0

고마워요, 토마스. 그러나이 쿼리를 실행하면 0 개의 레코드가 반환됩니다. 첫 번째 3 열만 기본 키를 구성하기 때문일 수 있습니다. 예, SS 2008을 사용하고 있습니다. J5C_MeasureNamesV2_Sys는 내 조회 테이블이지만 특히이 질문과 관련이 없습니다. – salvationishere

+0

설명을 업데이트했습니다. 너는 그것을 볼 수 있니? – salvationishere

관련 문제