【问题标题】:How to get concatenated name as concatinated id in sql server如何在sql server中将连接名称作为连接ID
【发布时间】:2018-05-23 18:00:47
【问题描述】:

我有学生查找表

学生桌

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) 微软公司 Windows NT 6.3(Build 9600:)(Hypervisor)上的开发人员版(64 位)

【问题讨论】:

  • 你为什么非规范化你的数据?无论如何,如果你想要这些结果,你会想要split your values,加入,然后group concat。这将是一种方法,这些链接会将您带到您想去的地方。
  • 这个数据模型有问题!!
  • 没有有效的方法来做到这一点。只需修复数据结构——了解什么是联结/关联表。
  • 我需要使用 ids,因为 ids 的名称将来可能会改变,但是无论我们想在哪里引用这个课程表,我们都需要显示学生姓名。我尝试使用拆分 id 并再次连接为学生姓名,但顺序与 id 的顺序不同。我也需要同样的订单。
  • 请标记您的 sql-server 版本。

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


【解决方案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;

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

【讨论】:

  • 非常感谢。
  • @Ashwini 非常感谢您说谢谢,但是在接受检查(在答案的投票计数器下方)打勾会更好。这将为我们双方支付声誉点数。一旦你自己越过了 15 点边界,你会被要求 - 另外 - 对贡献进行投票。这是说谢谢的方式。快乐编码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-15
相关资源
最近更新 更多