在 SQL 中使用逗号分隔值连接,表之间没有直接关系

Jit*_*pta 3 join sql-server

我有一张桌子 [CourseMaster] 喜欢

CourseId    CourseName
-----------------------
  01          ABC
  02          DEF
  03          GHI
  04          JKL
  05          MNO
  06          PQR
  07          STU
Run Code Online (Sandbox Code Playgroud)

我还有另一张表 [StudentMaster] 用于学生详细信息,例如

ROLLNO  NAME    ADDRESS       
------------------------------
12345   RAM     RAM ADDRESS                     
25695   HARI    HARI ADDRESS                   
89685   JEFF    JEFF ADDRESS              
47896   DAISY   DAISY ADDRESS 
Run Code Online (Sandbox Code Playgroud)

我还有另一张表 [StudentCourseMaster] 用于学生课程详细信息,例如

ROLLNO     CourseId      
-------------------
12345      01             
12345      02                 
12345      06            
25695      02
25695      06
89685      03
89685      05
89685      06
89685      07
47896      03
Run Code Online (Sandbox Code Playgroud)

我试图以以下格式获取结果,但无法进行连接。

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    
Run Code Online (Sandbox Code Playgroud)

我看过这个例子,但仍然无法弄清楚。

谢谢您,任何宝贵的建议将不胜感激。

Dan*_*man 5

对于 SQL Server 2017 及更高版本(包括 Azure SQL 数据库),使用相关子查询 来STRING_AGG获取每个学生的逗号分隔课程列表:

SELECT
     sm.ROLLNO
    ,sm.NAME
    ,sm.ADDRESS
    ,(SELECT STRING_AGG(cm.CourseName,',')
     FROM dbo.StudentCourseMaster AS scm
     JOIN dbo.CourseMaster AS cm ON cm.CourseId = scm.CourseId
     WHERE scm.ROLLNO = sm.ROLLNO
     ) AS Courses
FROM dbo.StudentMaster AS sm;
Run Code Online (Sandbox Code Playgroud)

在 SQL 2017 之前的版本中,您需要在子查询中使用 XML PATH 方法,就像您发布的示例中那样,而不是STRING_AGG.

下面是带有约束的 DDL 和示例数据:

CREATE TABLE dbo.CourseMaster(
     CourseId int NOT NULL CONSTRAINT PK_CourseMaster PRIMARY KEY
    ,CourseName varchar(30) NOT NULL
);
INSERT INTO dbo.CourseMaster(CourseId, CourseName)
VALUES
     (01, 'ABC')
    ,(02, 'DEF')
    ,(03, 'GHI')
    ,(04, 'JKL')
    ,(05, 'MNO')
    ,(06, 'PQR')
    ,(07, 'STU');

CREATE TABLE dbo.StudentMaster(
     ROLLNO int NOT NULL CONSTRAINT PK_StudentMaster PRIMARY KEY
    ,NAME varchar(30) NOT NULL
    ,ADDRESS varchar(30) NOT NULL
);
INSERT INTO dbo.StudentMaster(ROLLNO, NAME, ADDRESS)
VALUES(
     12345, 'RAM', 'RAM ADDRESS')
    ,(25695, 'HARI', 'HARI ADDRESS')
    ,(89685, 'JEFF', 'JEFF ADDRESS')
    ,(47896, 'DAISY', 'DAISY ADDRESS');

CREATE TABLE dbo.StudentCourseMaster(
     ROLLNO int NOT NULL
    ,CourseId int NOT NULL
    ,CONSTRAINT PK_StudentCourseMaster PRIMARY KEY(ROLLNO,CourseId)
    ,CONSTRAINT FK_StudentCourseMaster_CourseMaster FOREIGN KEY(CourseId) REFERENCES dbo.CourseMaster(CourseId)
    ,CONSTRAINT FK_StudentCourseMaster_StudentMaster FOREIGN KEY(ROLLNO) REFERENCES dbo.StudentMaster(ROLLNO)
);
INSERT INTO dbo.StudentCourseMaster(ROLLNO, CourseId)
VALUES
     (12345, 01)             
    ,(12345, 02)                 
    ,(12345, 06)            
    ,(25695, 02)
    ,(25695, 06)
    ,(89685, 03)
    ,(89685, 05)
    ,(89685, 06)
    ,(89685, 07)
    ,(47896, 03);
GO
Run Code Online (Sandbox Code Playgroud)