SQL帮助:选择语句连接一对多关系

时间:2008-12-15 14:08:07

标签: sql sql-server concatenation

例如我有两张桌子。第一张桌子是学生,第二张桌子是学生正在上的课程。如何使用select语句,以便我可以看到两列学生和课程,以便用逗号分隔课程。

感谢。

8 个答案:

答案 0 :(得分:10)

假设您正在使用SQL Server 2005:

这应该是您应该做的 - 显然可以根据需要替换字段:

出于演示目的,请考虑以下两种表结构:

Students(
  STU_PKEY Int Identity(1,1) Constraint PK_Students_StuPKey Primary Key,
  STU_NAME nvarchar(64)
)

Courses(
  CRS_PKEY Int Identity(1, 1) Constraint PK_Courses_CrsPKey Primary Key,
  STU_KEY Int Constraint FK_Students_StuPKey Foreign Key References Students(STU_PKEY),
  CRS_NAME nvarchar(64)
)

现在这个查询应该完成你之后的工作:

Select  s.STU_PKEY, s.STU_NAME As Student,
        Stuff((
            Select  ',' + c.CRS_NAME
            From    Courses c
            Where   s.STU_PKEY = c.STU_KEY
            For     XML Path('')
        ), 1, 1, '') As Courses 
From    Students s
Group By s.STU_PKEY, s.STU_NAME

比目前接受的答案更简单......

答案 1 :(得分:1)

create table Project (ProjectId int, Description varchar(50));
insert into Project values (1, 'Chase tail, change directions');
insert into Project values (2, 'ping-pong ball in clothes dryer');

create table ProjectResource (ProjectId int, ResourceId int, Name varchar(15));
insert into ProjectResource values (1, 1, 'Adam');
insert into ProjectResource values (1, 2, 'Kerry');
insert into ProjectResource values (1, 3, 'Tom');
insert into ProjectResource values (2, 4, 'David');
insert into ProjectResource values (2, 5, 'Jeff');

SELECT *, 
  (SELECT Name + ' ' AS [text()] 
   FROM ProjectResource pr 
   WHERE pr.ProjectId = p.ProjectId 
   FOR XML PATH ('')) 
AS ResourceList 
FROM Project p

--    ProjectId    Description                        ResourceList
--    1            Chase tail, change directions      Adam Kerry Tom 
--    2            ping-pong ball in clothes dryer    David Jeff 

答案 2 :(得分:0)

这取决于您使用的服务器。 SQL Server? MySQL的?其他

答案 3 :(得分:0)

一般来说,你所说的是一个加入:

SELECT 
    S.*,
    SC.*
  FROM
    Students S
    INNER JOIN Student_Courses SC
      ON S.student_id = SC.student_id

但是,每个课程会给你一行。 SQL不容易将一组课程作为逗号分隔列表放在一行中(这不是基于集合的操作)。根据供应商的不同,有不同的方法,包括循环。

答案 4 :(得分:0)

我认为这个MySQL页面可以帮助你。 http://dev.mysql.com/doc/refman/4.1/en/group-by-modifiers.html

答案 5 :(得分:0)

所以你想看看:

'Jade', 'Math, English, History'
'Kieveli', 'History, Biology, Physics'

是的,逗号分隔总是可取的,但SQL并不擅长。这是我一直计划使用的方法:

在SQL服务器上创建一个使用游标循环遍历子查询的函数(抱歉 - 我没有对此进行全面测试):

CREATE FUNCTION commacourselist(@studentname varchar(100))
RETURNS @List varchar(4096)
AS
BEGIN

DECLARE @coursename varchar(100)

DECLARE FOR
SELECT course.name FROM course WHERE course.studentname = @studentname
OPEN coursecursor

FETCH NEXT FROM coursecursor INTO @coursename 
WHILE @@FETCH_STATUS = 0
BEGIN
 IF @List = ''
 BEGIN
  SET @List = @coursename
 END
 ELSE
 BEGIN
  SET @List = @List + ',' + @coursename 
 END
 FETCH NEXT FROM coursecursor INTO @coursename 
END
CLOSE coursecursor 
DEALLOCATE coursecursor 

RETURN
END
GO

然后在查询中调用该函数:

SELECT student.name, 
       commacourselist( student.name )  
FROM student

答案 6 :(得分:0)

您可以使用游标通过相关记录进行游标并将返回字符串连接在一起,但这样会很昂贵 - 如果您一试,请确保您的游标是READ_ONLY FAST_FORWARD

答案 7 :(得分:0)

您使用的是2005年还是2008年?如果是,则查找PIVOT命令。它应该比带游标的函数更有效。