MS Access - вопрос SQL-запроса - PullRequest
       1

MS Access - вопрос SQL-запроса

2 голосов
/ 09 августа 2010

Система: 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)

Ответы [ 2 ]

0 голосов
/ 09 августа 2010
Select ...
From Survey As 
Where Exists    (
                Select 1
                From Questions As Q1
                    Join Answers As A1
                        On A1.IdQuestion = Q1.Id
                Where Q1.IdSurvey = S.Id
                    And Q1.Id = 3
                    And A1.Id In(1,2)
                Having Count(*) = 2
                )
0 голосов
/ 09 августа 2010
SELECT surv.Name FROM Survery surv
    INNER JOIN Questions quest ON surv.ID = quest.IDSurvey
    INNER JOIN Answers answ ON quest.ID = answ.IDQuestion
    WHERE quest.ID = 3 AND answ.Number IN (1, 2)

Это вернет одну строку для опроса (поскольку вы связываете только вопрос ID 3 и один ответ на этот вопрос), и только для опросов, где ответ на вопрос 3 равен 1 или 2.

ПРИМЕЧАНИЕ. Мне непонятно, как вы присоединяете таблицу вопросов и ответов в своей модели данных, поэтому я предположил, что таблица ответов содержит внешний ключ к вопросам, называемым IDQuestion.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...