2010-08-09 117 views
2

系統:Windows7的,Access 2003中,.mdb文件,C#語言,2010 VS的MS Access - SQL查詢問題

我在做與OleDbCommand的查詢,所以我寫在一個字符串完整的SQL查詢。


Table Survey (Id) 
Table Questions (Id,IdSurvey) 
Table Answers (Id,IdQuestion) 

表簡化爲只顯示相關的數據

假設1個調查1..1問題
假設1題有0到n回答

我只想選擇問題3中具有答案1和/或2的調查,我該怎麼做?

電流(差)的解決方案:

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) 

的 「」 在HAVING子句意味着至少需要兩行,並且由於答案不會針對相同的問題重複,因此這意味着至少針對所查詢的問題存在回答。

那麼,與更復雜的邏輯表達式處理時,像(1和(2 OR(4和(6或7)))),真相OR溶液和AND溶液都是壞是,它是非常不可能的,這樣的複雜性將需要,但我想要安全。對我來說,理想的解決辦法是這樣的:

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) 

回答

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

注意:我不清楚在數據模型中如何加入問題和答案表,因此我假設Answers表具有返回到問題的外鍵IDQuestion。

+0

感謝您的回答。 正如我所描述的,一個問題有很多答案,所以我相信您的解決方案可能會多次返回相同的問卷。請注意,這引入了「和」問題,我怎麼能用一個「IN」來做到這一點?似乎不可能。 – 2010-08-09 04:35:33

+0

如果每個問題都通過外鍵加入到單個調查中,並且每個答案都通過外鍵連接回單個問題,那麼SQL應該爲您提供正確的結果。我不確定您的模型是否將每個答案與單個_question_相關聯,這是使三個表聯合工作的必要條件。 – 2010-08-09 04:45:59

+0

問題是許多答案都加入到單個問題中。因此,相同的調查和相同的問題在N行上重複。 這是一個'1 x 0..n'的關係。另外,如何做「1和2」,而不是「1或2」? (您的解決方案適用於「1或2」,IN運算符) – 2010-08-09 13:28:58

0
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

如果我想讓答案爲「1和2」而不是「1或2」,該怎麼辦?請注意,您的解決方案適用於IN運算符「1或2」。 – 2010-08-09 13:32:27

+0

@WFF_Angel - 好的。簡單的修復。只需添加一個有條款。已更新我的帖子。 – Thomas 2010-08-09 14:46:01

+0

@WoF_Angel - 順便說一下,我對這個陳述所產生的困惑是:「只選擇具有問題3的答案1和/或2的調查。顯然你的意思是「答案1和2」。我把它表示爲「1或2」。在另一個說明中,'/和'代表'和/或'中代表什麼? ;> – Thomas 2010-08-09 14:53:36