这不是一个很好的标题(欢迎编辑),但这是一个摘要。我目前使用的查询工作正常,但可能比目前使用的查询更简单。我有一个表“ 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 exists
或group by
与having
子句一起使用:
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/