система: Windows7, Access 2003, .mdb файл, C# язык, VS 2010MS Access - SQL Query вопрос
Я делаю запросы с OleDbCommand, поэтому я пишу полный запрос SQL в строке.
Table Survey (Id)
Table Questions (Id,IdSurvey)
Table Answers (Id,IdQuestion)
таблиц упрощены, чтобы показать только соответствующие данные
Подозрение на 1 опрос 1..n вопросы
Подозрение на 1 вопрос имеет 0..n ответы
I хотите выбрать только опросы, в которых есть ответы 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)))
Это выглядит как дерьмо, так что я был бы признателен за помощь.
Заранее спасибо.
EDIT
Лучше решение я придумал:
Для 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)
"" в HAVING означает, что необходимы не менее двух строк, и поскольку ответы не повторяются для одних и тех же вопросов, это необходимо для того, чтобы, по крайней мере, ответы 1 И 2 существует для заданного вопроса.
Ну, как ИЛИ раствор и раствор И плохо при работе с более сложными логическими выражениями, как (1 и (2 OR (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)
Спасибо за ваш ответ. Как я описал, у одного вопроса есть много ответов, поэтому я считаю, что ваше решение может повторить один и тот же опрос много раз. Обратите внимание, что это вводит проблему «и», как я могу это сделать с помощью одного «IN»? Кажется невозможным. –
Если каждый вопрос присоединяется через внешний ключ, возвращается к одному опросу, и каждый ответ соединяется, используя внешний ключ, обратно к одному вопросу, тогда SQL должен дать вам правильный результат. Я не уверен, что ваша модель связывает каждый ответ с одним _question_, это необходимое условие для работы трех столов. –
Проблема в том, что многие ответы объединены с одним вопросом. И таким образом, один и тот же опрос и один и тот же вопрос повторяются над N строками. Это отношение «1 x 0..n». Кроме того, как сделать «1 и 2» вместо «1 или 2»? (ваше решение для «1 или 2», оператор IN) –