Comment puis-je comparer plusieurs lignes avec d'autres lignes de deux tables différentes et vérifier si elles sont égales ou non?

J'ai 2 table nommée OptionText et SubmittedAns La première table contient le QuestionId OptionId et IsRight . Ici IsRight est utilisé soit pour les options par rapport à la question est bonne ou fausse.Voici un QuestionId avoir plusieurs OptionId même peut en avoir un aussi. La deuxième table représente ce qui est soumis par l'user. Ils peuvent choisir une option ou une option multiple en fonction de leur hypothèse. Maintenant, je dois faire un script automatique qui justifiera soit les réponses soumises contre le bien ou le mal.

Remarque: Si une question comporte plus d'une option correcte, l'user doit sélectionner toutes les bonnes options, s'il en manque une, le résultat sera faux. Cependant, s'il sélectionne toutes les bonnes réponses, la réponse sera vraie.

J'ai essayé à travers ce script . C'est juste capable de countr les nombres choisis mais ne peut pas justifier la réponse est juste ou faux. J'ai donc besoin d'aide.

Je peux supposer que j'ai besoin d'une boucle WHILE pour vérifier chaque élément en particulier. Mais comment? J'ai donc besoin d'aide. Voici mon code.

 CREATE TABLE OptionText( [OptionTextId] [bigint] IDENTITY(1,1) NOT NULL, [QuestionId] [bigint] NOT NULL, [IsRightAnswer] [bit] NOT NULL) Insert into OptionText (QuestionId, IsRightAnswer) VALUES (5, 1) Insert into OptionText (QuestionId, IsRightAnswer) VALUES (5, 0) Insert into OptionText (QuestionId, IsRightAnswer) VALUES (5, 0) Insert into OptionText (QuestionId, IsRightAnswer) VALUES (17, 0) Insert into OptionText (QuestionId, IsRightAnswer) VALUES (17, 1) Insert into OptionText (QuestionId, IsRightAnswer) VALUES (17, 1) CREATE TABLE SubmittedAns( [Id] [bigint] IDENTITY(1,1) NOT NULL, [QuestionId] [bigint] NOT NULL, [OptionTextId] [bigint] NOT NULL) Insert into SubmittedAns (QuestionId, OptionTextId) VALUES (5, 1) Insert into SubmittedAns (QuestionId, OptionTextId) VALUES (5, 2) Insert into SubmittedAns (QuestionId, OptionTextId) VALUES (2, 1) Insert into SubmittedAns (QuestionId, OptionTextId) VALUES (2, 1) select * from OptionText select * from SubmittedAns if (select count(OptionTextId) from SubmittedAns where QuestionId =5) = (select count(ot.OptionTextId) from OptionText as ot where ot.IsRightAnswer = 1) select 1 as "isRight" else select 0 as "isRight" 

Veuillez vous référer à la première et dernière ligne pour le matériel critique:

 SELECT CASE COUNT(*) WHEN 0 THEN 'Pass' ELSE 'Fail' END AS Boolean FROM ( SELECT * FROM #OptionText WHERE QuestionId = 5 AND IsRightAnswer = 1 ) AS OT FULL OUTER JOIN #SubmittedAns AS SA ON OT.QuestionId = SA.QuestionId AND OT.OptionTextId = SA.OptionTextId WHERE SA.QuestionId = 5 AND OT.OptionTextId IS NULL -- This means some answers failed to be matched with your original questions/options, either because IsRightAnswer is zero, or because it doesn't exist in your questions/answers. 

J'ai une solution sur ma façon de comprendre. J'ai donc utilisé une fonction pour l'appliquer à toutes les questions et j'ai créé ce code. Ça marche.

 CREATE FUNCTION [dbo].[Set_IsCorrect_Answer_Deva] ( @QuestionId BIGINT ) RETURNS BIT AS BEGIN DECLARE @IsRightAns BIT DECLARE @count int set @IsRightAns = 0 Declare @supplied_count int select @supplied_count = Count(*) from SuppliedAnswersTemp where QuestionId=@QuestionId IF(@supplied_count>0) Begin IF(@supplied_count=(select Count(*) from OptionText where QuestionId=@QuestionId and IsRightAnswer=1)) Begin select @count=Count(*) from OptionText ot join SuppliedAnswersTemp sa on ot.QuestionId = sa.QuestionId where ot.QuestionId= @QuestionId and ot.IsRightAnswer =1 and ot.Id=sa.OptionId END END IF(@count>0) Set @IsRightAns=1 RETURN @IsRightAns END