如何在sql server

时间:2018-05-23 18:00:47

标签: sql sql-server tsql sql-server-2014

我有学生查询表

学生表

Student id  Student name
1               Sonu
2               Janu
3               Sameer
4               Shri

课程表

Course Name  Student Id
JAVA          1,2,3
SQL            2,3
HTML           3,4
PHP            2,1

我正在使用另一个表,即课程表,在该表中我只是用逗号分隔值输入学生ID。现在我想使用课程表中的学生ID来获取学生姓名,并且学生姓名应该与学生ID一样,存储在课程表中

结果应为

Course Name  Student Name
JAVA           Sonu,Janu,Sameer
SQL            Janu, Sameer
HTML           Sameer,Shri
PHP            Janu,Sonu

任何人都可以帮忙解决这个问题

我的sql版本是:Microsoft SQL Server 2014 - 12.0.2000.8(X64)     2014年2月20日20:04:26     版权所有(c)Microsoft Corporation     Windows NT 6.3(Build 9600:)(管理程序)

上的Developer Edition(64位)

1 个答案:

答案 0 :(得分:1)

您正在寻找的是典型的m:n关系。

你有学生,你有课程。它们都独立存在。 现在你要存储,哪个学生参加哪个课程。因此,您需要一个映射表

CREATE TABLE Student(ID INT NOT NULL CONSTRAINT PK_Student PRIMARY KEY
                    ,FirstName NVARCHAR(200) NOT NULL
                    ,LastName NVARCHAR(200) NOT NULL);

INSERT INTO Student(ID,FirstName,LastName) 
                    VALUES(1,'Sonu','Jones')
                         ,(2,'Janu','Smith')
                         ,(3,'Sameer','Miller')
                         ,(4,'Shri','Wilson');

CREATE TABLE Course(ID INT NOT NULL CONSTRAINT PK_Course PRIMARY KEY
                   ,Title NVARCHAR(200) NOT NULL);

INSERT INTO Course(ID,Title) 
                   VALUES(1,'JAVA')
                        ,(2,'SQL')
                        ,(3,'HTML')
                        ,(4,'PHP');

CREATE TABLE CourseStudent(ID INT IDENTITY CONSTRAINT PK_CourseStudent PRIMARY KEY
                          ,CourseID INT NOT NULL CONSTRAINT FK_CourseID FOREIGN KEY REFERENCES Course(ID)
                          ,StudentID INT NOT NULL CONSTRAINT FK_StudentID FOREIGN KEY REFERENCES Student(ID));

INSERT INTO CourseStudent VALUES(1,1),(1,2),(1,3) --Course 1 is taken by 1,2,3
                               ,(2,2),(2,3)       --Course 2 is taken by 2 and 3
                               ,(3,3),(3,4)
                               ,(4,2),(4,1);

- 这是您用于获取数据映射的典型select

SELECT c.Title
      ,s.FirstName
FROM Course AS c
INNER JOIN CourseStudent AS cs ON c.ID=cs.CourseID
INNER JOIN Student AS s ON s.ID=cs.StudentID

- 这是您用来将参加的学生作为连接字符串的选择:

SELECT c.Title
      ,STUFF(
              (
                SELECT ', ' + s.FirstName 
                FROM CourseStudent AS cs
                INNER JOIN Student AS s ON cs.StudentID=s.ID 
                WHERE cs.CourseID=c.ID
                FOR XML PATH(''),TYPE
              ).value('.','nvarchar(max)'),1,2,''
            ) AS StudentName
FROM Course AS c;

我正在使用一个相当奇怪的技巧来实现分组字符串连接。 SQL-Server 2017+为此引入了STRING_AGG()