例如我有两张桌子。第一个表是学生,第二个表是学生正在学习的课程。如何使用 select 语句,以便我可以看到两列学生和课程,以便课程用逗号分隔。
谢谢。
例如我有两张桌子。第一个表是学生,第二个表是学生正在学习的课程。如何使用 select 语句,以便我可以看到两列学生和课程,以便课程用逗号分隔。
谢谢。
假设您使用的是 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
比当前接受的答案简单得多......
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
这取决于您使用的服务器。SQL 服务器?MySQL?其他?
通常,您所说的是联接:
SELECT
S.*,
SC.*
FROM
Students S
INNER JOIN Student_Courses SC
ON S.student_id = SC.student_id
但是,这将为您每门课程提供一排。SQL 并不容易将一组课程作为逗号分隔的列表放在一行中(这不是基于集合的操作)。根据供应商的不同,有不同的方法可以做到这一点,包括循环。
我认为这个 MySQL 页面会帮助你。 http://dev.mysql.com/doc/refman/4.1/en/group-by-modifiers.html
所以你想看到:
'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
您可以使用 UDF 游标通过相关记录并将返回字符串连接在一起,但这会很昂贵 - 如果您试一试,请确保您的游标是 READ_ONLY FAST_FORWARD
你用的是2005还是2008?如果是这样,则查找 PIVOT 命令。它应该比带有游标的函数更有效。