我有一张桌子[CourseMaster]
喜欢
CourseId CourseName
-----------------------
01 ABC
02 DEF
03 GHI
04 JKL
05 MNO
06 PQR
07 STU
我还有一张[StudentMaster]
学生详细信息表
ROLLNO NAME ADDRESS Course
------------------------------------------------
12345 RAM RAM ADDRESS 01,02,06
25695 HARI HARI ADDRESS 02,06
89685 JEFF JEFF ADDRESS 03,05,06,07
47896 DAISY DAISY ADDRESS 03
在这里,我想使用CourseName
(Not CourseId
) 获取学生详细信息。
如果 in 中的值Course
不是逗号分隔的,那么query
使用 join 获取详细信息将非常简单。
据我所知,我可以运行两个queries
以获得我想要的相同结果,一个查询用于从[StudentMaster]
前端获取学生的详细信息。另一个仅通过循环对应来获取CourseName
from 。[CourseMaster]
CourseId
但事实上我只想要一个结果query
而不是queries
为这个小任务写两个。
我想这是 100% 可能的。我的预期结果将如下所示:
ROLLNO NAME ADDRESS Course
-------------------------------------------
12345 RAM RAM ADDRESS ABC,DEF,PQR
25695 HARI HARI ADDRESS DEF,PQR
89685 JEFF JEFF ADDRESS GHI,MNO,PQR,STU
47896 DAISY DAISY ADDRESS GHI
谢谢您,任何有价值的建议将不胜感激。
你真的应该有一个学生正在学习的课程的连接表,而不是将逗号分隔的值塞进一个单独的元组中。如果您认为这是由于这种次优设计而导致的最后一个问题,那么您将大吃一惊。你真的应该让这个项目的所有者阅读规范化 - 是的,改变你的模式很痛苦,但不断处理保持原样的限制也是如此。
无论如何,话虽如此,您需要一个拆分功能。由于您的逗号分隔值是数字,因此您可以使用我的 XML 函数的变体;在这篇博文中还有其他几个可供选择。
现在,您的查询是:
同样,这是一个复杂的解决方案,并且由于您的数据库结构较差,您必须执行的下一个查询将同样复杂和繁琐。几乎所有关于该主题的博客、文章或书籍都反对这种类型的设计是有原因的……
在更现代的版本(SQL Server 2017 及更高版本)中,您可以组合
STRING_AGG()
并STRING_SPLIT()
使其更简单:CourseMaster.CourseId
与 Aaron Bertrand 在构建逗号分隔值时提供的解决方案相同,但在连接StudentMaster.Course
.SQL小提琴
MS SQL Server 2014 架构设置:
查询 1:
结果:
从表中获取列表值的一种简单方法
StudentMaster
(您可以根据结果加入)是(借助前面提到的拆分字符串回复,并假设该函数为每个列表项返回一个名为 item 的列) :