Система: Windows7, Access 2003, файл .mdb, язык C #, VS 2010
Я выполняю запросы с помощью OleDbCommand, поэтому я записываю полный SQL-запрос в строку.
Table Survey (Id)
Table Questions (Id,IdSurvey)
Table Answers (Id,IdQuestion)
таблицы упрощены для отображения только релевантных данных
Предположим, что в 1 опросе есть 1..n вопросов
Предположим, что в 1 вопросе есть 0..n ответов
Я хочу выбрать только те опросы, которые имеют ответы 1 и / или 2 для Вопроса 3, как мне это сделать?
Текущее (и плохое) решение:
SELECT surv.Name FROM Survey surv WHERE
(1 IN (SELECT answ.Number FROM Answers answ, Questions quest
WHERE quest.Id = 3 AND quest.IdSurvey = surv.Id)
AND/OR
(2 IN (SELECT answ.Number FROM Answers answ, Questions quest
WHERE quest.Id = 3 AND quest.IdSurvey = surv.Id)))
Это похоже на дерьмо, поэтому я был бы признателен за помощь.
Заранее спасибо.
РЕДАКТИРОВАТЬ
Лучшее решение, которое я нашелс:
Для 1 ИЛИ 2 приведенных здесь решений достаточно (для очень простых логических выражений).Спасибо, ребята
За 1 И 2 , я создал другое решение, я думаю, выглядит неплохо (опять же, для очень простых логических выражений)
SELECT surv.Name FROM Survey surv WHERE EXISTS
(SELECT COUNT(*) FROM Answers answ, Questions quest
WHERE quest.Id = 3 AND answ.Number IN (1,2) HAVING COUNT(*) > 1)
" 1"в предложении HAVING означает, что необходимо по крайней мере две строки, и поскольку ответы не повторяются для одних и тех же вопросов, это обязательно означает, что по крайней мере ответы 1И 2 существует для запрашиваемого вопроса.
Что ж, и решение ИЛИ , и решение И плохи при работе с более сложными логическими выражениями, такими как (1 И (2 ИЛИ (4 И (6 ИЛИ 7)))) правда, очень маловероятно, что такая сложность понадобится, но я бы хотел быть в безопасности.Идеальным решением для меня было бы это:
SELECT surv.Name FROM Survey surv WHERE
(1 IN (SELECT answ.Number FROM Answers answ, Questions quest
WHERE quest.Id = 3 AND quest.IdSurvey = surv.Id) AS CANT_DO_THIS
AND/OR
(2 IN CANT_DO_THIS) AND/OR 5 IN CANT_DO_THIS AND/OR 3 NOT IN CANT_DO_THIS)