2010-08-24 3 views
-1

J'essaie de développer une requête pour retourner simplement des enregistrements non-dupliqués afin que je puisse les ajouter à ma base de données, mais je continue d'obtenir l'erreur d'enregistrement en double.Comment formuler T-SQL pour exclure les doublons?

J'ai essayé votre solution, mais j'ai toujours un problème d'erreur en double. J'ai supprimé les 35 lignes qui étaient en double. Quoi d'autre pourrait causer cela? Voici ma requête. Une partie de la confusion que je pense est que measureid est une seule colonne dans j5c_MasterMeasures, mais cette valeur provient de deux champs dans 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 

Répondre

0

Vous n'avez pas menstioned les spécificités de la contrainte unique sur J5C_MasterMeasures. Par conséquent, j'ai supposé que les quatre colonnes insérées faisaient partie de la contrainte. En outre, votre utilisation de Except m'amène à croire que vous utilisez SQL Server 2005 ou plus tard. En outre, il n'est pas clair comment la jointure à J5C_MeasureNamesV2_Sys s'intègre dans la conception ou la solution.

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

Merci beaucoup, Thomas. Cependant, lorsque j'exécute cette requête, elle renvoie 0 enregistrements. Peut-être est-ce parce que seules les trois premières colonnes comprennent la clé primaire. Oui, j'utilise SS 2008. J5C_MeasureNamesV2_Sys est ma table de recherche - mais pas particulièrement pertinent pour cette question. – salvationishere

+0

J'ai mis à jour ma description. Tu peux le regarder? – salvationishere

Questions connexes