J'ai ce genre de requête dans mon ms sql.
SELECT OdeaMainDataBase.dbo.ItemChoicesTable.*, CASE WHEN EXISTS(SELECT * FROM StudentTestTablefromRemark WHERE StudID = @studId AND ExamID = @examId AND ItemBankID = @itemBankId AND ChoiceID = OdeaMainDataBase.dbo.ItemChoicesTable.ChoiceID) THEN 'True' ELSE 'False' END AS isAnswered FROM OdeaMainDataBase.dbo.ItemChoicesTable WHERE ItemBankID = @itemBankId
J'observe que l'instruction CASE
j'ai faite provoque l'exécution lente de ma requête. Quand je supprime ce CASE
, il s'exécute rapidement mais j'ai besoin de ce cas pour ma sortie.
Voici la structure que je veux afficher
Tableau de choix des articles
ItemBankID ChoiceID ChoiceLetter -------------------------------------- 1 1 A 1 2 B 1 3 C 2 4 A 2 5 B 2 6 C
Tableau des réponses des élèves
ItemBankID ChoiceID ChoiceLetter StudentId ------------------------------------------------- 1 2 B 123 2 6 C 123
Sortie désirée
ItemBankID ChoiceID ChoiceLetter IsAnswered ---------------------------------------------------- 1 1 A False 1 2 B True 1 3 C False 2 4 A False 2 5 B False 2 6 C True
Je veux atteindre cette sortie sans ralentir mon programme.
Toute idée me fera.
Merci beaucoup
Essaye ça
SELECT i.*, CASE WHEN s.ChoiceID IS NULL THEN 'False' ELSE 'True' END FROM OdeaMainDataBase.dbo.ItemChoicesTable i LEFT OUTER JOIN StudentTestTablefromRemark s ON s.ChoiceID = i.ChoiceID AND s.ItemBankID = i.ItemBankID AND s.StudID = @studId AND s.ExamID = @examId WHERE i.ItemBankID = @itemBankId
Essayez cette requête
SELECT OdeaMainDataBase.dbo.ItemChoicesTable.*, ISNULL(a,'False') as isAnswered FROM OdeaMainDataBase.dbo.ItemChoicesTable left outer join(Select 'True' as a,ChoiceID FROM StudentTestTablefromRemark Where StudID=@studId AND ExamID=@examId AND ItemBankID=@itemBankId )b on b.ChoiceID=OdeaMainDataBase.dbo.ItemChoicesTable.ChoiceID Where ItemBankID = @itemBankId