2015-07-31 3 views
1

У меня такой запрос в моем ms sql.Как сделать запрос MS SQL Server быстрее?

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 

Я наблюдаю, что CASE заявление, которое я сделал вызывает мой запрос, чтобы работать медленно. Когда я удаляю этот CASE, он работает быстро, но мне нужен этот случай для моего вывода.

Вот структура Я хочу, чтобы отобразить

Пункт Выбор Таблица

ItemBankID ChoiceID ChoiceLetter 
-------------------------------------- 
1   1   A 
1   2   B 
1   3   C 
2   4   A 
2   5   B 
2   6   C 

Студента Ответы Таблица

ItemBankID ChoiceID ChoiceLetter StudentId 
------------------------------------------------- 
1   2   B    123 
2   6   C    123 

Желаемая Выход

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 

Я хочу достичь этого выхода без замедления моей программы.

Любая идея будет со мной.

Спасибо большое

ответ

2

Попробуйте

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

Спасибо так много вы спасли мой день :) –

1

Попробуйте этот запрос

SELECT OdeaMainDataBase.dbo.ItemChoicesTable.*, 
ISNULL(a,'False') as isAnswered 
FROM OdeaMainDataBase.dbo.ItemChoicesTable 
left outer join(Select 'True' as a,ChoiceID FROM StudentTestTablefromRemark 
Where [email protected] AND [email protected] AND [email protected])b on b.ChoiceID=OdeaMainDataBase.dbo.ItemChoicesTable.ChoiceID 
Where ItemBankID = @itemBankId 
+0

Спасибо за ответ :) –

Смежные вопросы