求助:如何编写SQL查询获取两表组合后的唯一结果集?
解决问题:获取问题与选项的唯一组合
先给你最直接的可行方案,针对你要的「问题文本+选项文本无重复,同时保留每个问题的所有选项子集」需求,用DISTINCT配合表关联就能实现:
SELECT DISTINCT q.Text AS QuestionText, o.Text AS OptionText FROM Questions q JOIN Options o ON q.Id = o.QuestionId ORDER BY q.Text, o.Text;
为什么这个能生效?
JOIN会把每个问题和它对应的所有选项关联起来;DISTINCT会自动去除(QuestionText, OptionText)完全重复的行,只保留唯一组合;- 排序是为了让同一个问题的选项集中展示,方便查看。
如果习惯用GROUP BY,也可以这么写(效果和上面的DISTINCT一致):
SELECT q.Text AS QuestionText, o.Text AS OptionText FROM Questions q JOIN Options o ON q.Id = o.QuestionId GROUP BY q.Text, o.Text ORDER BY q.Text, o.Text;
注意必须同时按问题文本和选项文本分组,如果只按问题分组,会导致每个问题只返回一条选项,这应该是你之前用GROUP BY失败的原因。
额外场景:保留无选项的问题
如果你的数据库里存在没有对应选项的问题,且需要把这些问题也保留在结果里,把JOIN改成LEFT JOIN即可:
SELECT DISTINCT q.Text AS QuestionText, o.Text AS OptionText FROM Questions q LEFT JOIN Options o ON q.Id = o.QuestionId ORDER BY q.Text, o.Text;
此时无选项的问题对应的OptionText会显示为NULL。
可能的坑
如果你的数据库里Text是关键字(比如SQL Server、MySQL里),需要用反引号或方括号把字段名括起来,比如MySQL用q.Text``,SQL Server用q.[Text],避免语法错误。
内容的提问来源于stack exchange,提问作者szoradam
相关产品推荐
相关产品推荐

