这不是一个很好的标题(欢迎编辑),但这是一个摘要。我目前使用的查询工作正常,但可能比目前使用的查询更简单。我有一个表“ answer”,列为“ QuestionIDFK,Answer,QuestionaireIDFK”。表中的数据类似于

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


这意味着用户为问卷1和2提供了问题2的答案,但没有为问卷3和4提供问题2的答案。我需要的是没有问题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%'

最佳答案

您只需将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,这不太可能具有比第一种方法更好的性能。

关于sql - 获取缺少答案的问卷调查表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27601334/

10-10 14:50