2017-09-25 3 views
0

J'ai 3 tables:Sélectionner la commande retourner les lignes en double

Tableau 1 ExamTB:

ID ExamTerm ExamDate 
1 MidTerm 2017-09-24 
2 FinalTerm 2017-12-01 

Tableau 2 ExamSubMarksTB

ID ExamID ClassID SubjectID TotalMarks PassMarks 
1  1   1  1  100   50 
2  1   1  2  100   50 
3  1   1  3  100   50 
4  2   1  1  100   50 
5  2   1  2  100   50 
6  2   1  3  100   50 

Tableau 3 ExamResultTB

ID ExamID ClassID SubjectID MarksObtain StdID 
1  1   1   1   80   1 
2  1   1   2   70   1 
3  1   1   3   60   1 
4  2   1   1   50   1 
5  2   1   2   72   1 
6  2   1   3   68   1 

Maintenant, quand je crée une procédure stockée le SELECT cette commande Sélectionner renvoie des lignes en double

SELECT ExamResultTB.ExamID 
    , ExamTB.ExamTerm 
    , ExamTB.ExamDate 
    , ExamResultTB.StdID 
    , StudentTB.Name 
    , StudentTB.FatherName 
    , ClassTB.ClassName 
    , SubjectTB.Subject 
    , ExamResultTB.ObtainMarks 
    , ExamSubMarksTB.TotalMarks 
    , ExamSubMarksTB.PassMarks 
FROM ExamResultTB 
    INNER JOIN ExamTB ON ExamResultTB.ExamID = ExamTB.ID 
    INNER JOIN ClassTB ON ExamResultTB.ClassID = ClassTB.ID 
    INNER JOIN SubjectTB ON ExamResultTB.SubjectID = SubjectTB.ID 
    INNER JOIN StudentTB ON ExamResultTB.StdID = StudentTB.ID 
    INNER JOIN ExamSubMarksTB ON ExamResultTB.ExamID = ExamSubMarksTB.ExamID 
WHERE ExamResultTB.ExamID = 4 
    AND ExamResultTB.StdID=1 
+0

Il suffit d'utiliser la commande DISTINCT avant les colonnes dans la requête de sélection pour éviter la duplication a mangé. –

+0

ne devrait pas un de ces _Table 2_ avoir un nom différent? – SqlZim

+1

@YogeshSharma ... Dans mon expérience, dans 90% des cas, DISTINCT ne fait que masquer une erreur dans la requête. Vous devriez ** toujours ** d'abord savoir d'où viennent les doublons, et n'utiliser que DISTINCT en dernier recours. – HoneyBadger

Répondre

1

Pour que cette ligne faire une ligne en double:

INNER JOIN ExamSubMarksTB ON ExamResultTB.ExamID = ExamSubMarksTB.ExamID 

Vous devriez le faire de cette façon :

INNER JOIN ExamSubMarksTB ON ExamResultTB.ExamID = ExamSubMarksTB.ExamID and 
ExamResultTB.ClassId = ExamSubMarksTB.ClassId and ExamResultTB.SubjectID = 
ExamSubMarksTB.SubjectID 
+0

Oui, cette ligne faisait problème et maintenant il travaille avec votre correction Merci beaucoup, je me battais avec cela de la nuit dernière (y) –