给出这些简化的多项选择表,其中有时不止一个答案是正确的:
STUDENT_ANSWERS
AnswerID | StudentID | QuestionID | Answers
-------------------------------------------
1 | 1 | 1 | C,D
QUESTION_ANSWERS
QuestionID | Answer | Text
-------------------------------------------------
1 | A | This is answer A
1 | B | B could also be correct
1 | C | Maybe it's C?
1 | D | Definitely D!
如何选择将答案转换为描述的选项?
我的开始:
SELECT *
FROM STUDENT_ANSWERS sa
LEFT OUTER JOIN QUESTION_ANSWERS qa ON qa.Answer IN sa.Answers???
-- Doesn't seem to work as IN requires a format of ('C','D') while I have 'C,D'
所需输出:
AnswerID | StudentID | QuestionID | AnswerDescriptions
-------------------------------------------
1 | 1 | 1 | Maybe it's C?,Definitely D!
所以描述只需要替换代码,而不是每个答案都有一行。
4条答案
按热度按时间nuypyhwy1#
你的问题是表
STUDENT_ANSWERS
的结构。每个答案应该有一行:现在,假设你不能做任何改变(阅读:修复)这个,你可以通过附加逗号和使用LIKE来捏造它:
SQL Fiddle演示
请注意,* 假设您永远不会在
QUESTION_ANSWERS.Answer
* 中包含文本,
。它也永远无法使用索引,所以它会比慢更慢。如果您 * 绝对必须 * 在数据库中将其格式化为一行,则可以使用
STUFF
和FOR XML PATH('')
技巧来连接结果行。bt1cpqcv2#
这是只使用
T-SQL
语句的完整工作示例。我建议你创建一个单独的函数来分割CSV
,并返回行集。此外,如果您正在处理大量数据,您可能需要创建一个CLR
函数来拆分值。看看this article(这里有你需要的一切)。cclgggtu3#
试试这个
绝对有效。
mklgxw1f4#
我一直在问同样的问题。但仅适用于MariaDB。
查看dbfiddle
那是:
变成:
如您所见,我们保存了一个名称顺序。
我希望它能帮助到别人!