You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写SQL实现按MaxNoAnswers生成问卷问题标签?

问题:根据问题的最大可选数量生成对应数量的问题标签

我正在制作一份展示调查结果的报告,对于带有选项的问题,需要为每个选项生成一行数据以创建问题标签,但部分问题限制了用户可选择的选项数量。

数据库架构

Question表

-----------------------------------------------------------
|    ID   |   Question    |   Sequence     | MaxNoAnswers |
-----------------------------------------------------------
|       1 |    Question 1 |              1 |            2 |
|       2 |    Question 2 |              2 |         NULL | 
-----------------------------------------------------------

Options表

-------------------------------------------------------
|OptionID |   Name        |  QuestionID    | Sequence |
-------------------------------------------------------
|       1 |    Option 1   |              1 |        1 |
|       2 |    Option 2   |              1 |        2 |
|       3 |    Option 3   |              1 |        3 |
|       4 |    Option 4   |              1 |        4 |
|       5 |    Option 5   |              2 |        1 |
|       6 |    Option 6   |              2 |        2 |
|       7 |    Option 7   |              2 |        3 |
|       8 |    Option 8   |              2 |        4 |
-------------------------------------------------------

我原本使用的SQL语句如下:

SELECT 'Q' + CONVERT(NVARCHAR(10), q.[ID]) + '_' + CONVERT(NVARCHAR(10), o.Sequence) AS QuestionLabel, q.Question 
FROM Question q
INNER JOIN Options o ON o.QuestionID = q.ID

执行后得到的结果:

-----------------------------------
|  QuestionLabel  |   Question    | 
-----------------------------------
|    Q1_1         |    Question 1 |
|    Q1_2         |    Question 1 | 
|    Q1_3         |    Question 1 |
|    Q1_4         |    Question 1 | 
|    Q2_1         |    Question 2 |
|    Q2_2         |    Question 2 | 
|    Q2_3         |    Question 2 |
|    Q2_4         |    Question 2 | 
-----------------------------------

但我需要实现:当问题设置了MaxNoAnswers时,仅生成从1到该数值的标签;如果MaxNoAnswers为NULL,则保留所有选项对应的标签。预期结果如下:

-----------------------------------
|  QuestionLabel  |   Question    | 
-----------------------------------
|    Q1_1         |    Question 1 |
|    Q1_2         |    Question 1 | 
|    Q2_1         |    Question 2 |
|    Q2_2         |    Question 2 | 
|    Q2_3         |    Question 2 |
|    Q2_4         |    Question 2 | 
-----------------------------------

请问如何编写SQL实现该需求?


解决方案

你可以通过添加条件过滤来实现需求,以下是两种可行的实现方式:

方式一:在WHERE子句中添加过滤逻辑

SELECT 
    'Q' + CONVERT(NVARCHAR(10), q.[ID]) + '_' + CONVERT(NVARCHAR(10), o.Sequence) AS QuestionLabel, 
    q.Question 
FROM Question q
INNER JOIN Options o ON o.QuestionID = q.ID
WHERE 
    (q.MaxNoAnswers IS NOT NULL AND o.Sequence <= q.MaxNoAnswers)
    OR q.MaxNoAnswers IS NULL

方式二:在JOIN条件中整合过滤逻辑

SELECT 
    'Q' + CONVERT(NVARCHAR(10), q.[ID]) + '_' + CONVERT(NVARCHAR(10), o.Sequence) AS QuestionLabel, 
    q.Question 
FROM Question q
INNER JOIN Options o 
    ON o.QuestionID = q.ID
    AND (q.MaxNoAnswers IS NULL OR o.Sequence <= q.MaxNoAnswers)

逻辑说明

  • 对于MaxNoAnswers不为NULL的问题,仅保留选项Sequence值小于等于该限制数值的记录;
  • 对于MaxNoAnswers为NULL的问题,保留所有关联的选项记录。

两种方式都能得到预期结果,推荐使用方式二,因为将过滤条件放在JOIN中可以提前筛选不符合条件的记录,性能表现更优。

内容的提问来源于stack exchange,提问作者antonio_mg

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 09:13:09