2014-12-22 60 views
4

這不是一個很好的標題(歡迎編輯),但這裏有一個總結。我目前的查詢工作正常,但可能比我目前使用的更容易。我有一個表'答案'列'QuestionIDFK,答案,QuestionnaireIDFK'。該表中的數據是一樣的東西獲取缺少答案的問卷清單

QuestionIDFK Answer QuestionnaireIDFK 
1    N   1 
2    N   1 
3    N   1 
1    Y   2 
2    Y   2 
3    Y   2 
1    N   3 
3    N   3 
1    Y   4 
3    Y   4 

這意味着用戶給了一個答案的問題2問卷1和2,但對於問題2問卷3和4。未提供答案,我需要的是它不具備的問題2回答那麼預期輸出問卷ID列表是

QuestionnaireWithMissingAnswer2 
3 
4 

我用下面這個查詢,它工作正常,但不知道是否有一個更簡單的方法:

SELECT distinct a.QuestionnaireIDFK AS QuestionnaireWithMissingAnswer2 
FROM Answer a 
inner join (
SELECT t.QuestionnaireIDFK, 
     STUFF(ISNULL((SELECT ', ' + convert(nvarchar, x.QuestionIDFK) 
       FROM Answer x 
       WHERE x.QuestionnaireIDFK = t.QuestionnaireIDFK 
       GROUP BY x.QuestionIDFK 
       FOR XML PATH (''), TYPE).value('.','VARCHAR(max)'), ''), 1, 2, '') 
       AS QuesList 
    FROM Answer t 
    GROUP BY t.QuestionnaireIDFK) z 
ON z.QuestionnaireIDFK = a.QuestionnaireIDFK AND z.QuesList NOT LIKE '%2%' 
+0

您還沒有提供完整的信息。與QuestionID列表一樣,必須有其他表格。 那麼爲什麼不選擇* from QuestionnaireTable哪裏不存在(select * from Answer)。就像這樣。 – KumarHarsh

+0

@KumarHarsh有問題ID的問題表,但不同的問卷有不同的問題。一份問卷有10個問題,另一份問卷有25個問題,你的建議是有道理的,但我可以使用的只是問卷和提供的答案。 – artm

回答

2

你只想用not existsgroup byhaving條款:

select QuestionnaireIDFK 
from answer 
group by QuestionnaireIDFK 
having sum(case when QuestionIDFK = 2 then 1 else 0 end) = 0; 

這得到沒有問題#2(至少有一些答案全部問卷)的所有問卷。

您也可以用not exists(或left outer join)做到這一點:

select distinct QuestionnaireIDFK 
from answer 
where not exists (select 1 
        from answer a2 
        where a.QuestionnaireIDFK = a2.QuestionnaireIDFK and 
         a2.QuestionIDFK = 2 
       ); 

但是,由於distinct,這是不太可能有比第一種方法更好的性能。

1

使用左外連接,連接上鍵和接聽ID兩者,然後篩選出成功使用where子句連接:

select q.* 
from Questionnaire q 
left join Answer a on a.QuestionnaireIDFK = q.id 
    and a.QuestionIDFK = 2 
where a.QuestionnaireIDFK is null 

它使相當整潔,高效的查詢和工作,因爲在那裏在連接完成後應用的子句只能在未連接時才爲真。 「訣竅」是將有問題的條件放入連接條件中,連接條件在連接期間進行評估(將問題條件放在where子句中將有效地使其成爲內部連接)。

另請注意,您永遠不會得到重複項,因爲當加入我們錯過時,主表中只有一行返回。

另請注意,調查問卷根本無需任何答案。