关于以下帖子,我有一个问题,我会补充一下,但是因为我是新人,所以不会让我这么做。
编辑添加特定类型的表格和更好的信息
我在下面有两个表格,希望将studentname的tblnames转换为tblCombineNames成为学生名称。
请指教,谢谢!
TblNames
ID(PK) StudentType(FK) StudentNo(FK) GradeNo(FK) StudentName
---------- ---------- ---------- ---------- -------------
1 1 1 1 Mary
2 1 1 1 John
3 1 1 1 Sam
4 2 2 2 Alaina
5 2 2 2 Edward
6 2 2 2 Joe
我希望输出低于
TblCombineNames
ID(PK) StudentType(PK) StudentNo(PK) GradeNo(PK) StudentNames
---------- ---------- ---------- ---------- -------------
1 1 1 1 Mary, John, Sam
2 2 2 2 Alaina, Edward, Joe
我会有一个名为
的标量值函数---dbo.fn_Concatenate_Names
ALTER FUNCTION [dbo].[fn_Concatenate_Names]
(
@StudentType VARCHAR(250),
@StudentNo VARCHAR(250),
@GradeNo VARCHAR(250)
)
RETURNS Varchar(250)
BEGIN
Declare @rtn Varchar(250)
BEGIN
Select @rtn=(
Select StudentNames + ', ' as 'data()'
from tblStudentnames
where studentType = @StudentType and StudentNo = @StudentNo and GradeNo = @GradeNo
for XML path('')
)
Set @rtn = LEFT(@rtn, Len(@rtn) - 1)
END
RETURN (@rtn)
END
我会做更新,比如调用函数
update tblCombineNames
set studentnames = fn_concatenate_names(StudentType,StudentNo,GradeNo)
它似乎可以工作,但需要2个小时才能在250730条记录的tblStudentNames上运行。我认为不应该花那么长时间。
答案 0 :(得分:1)
您可以简单地将其放在子查询中,并使用表格JOIN
将其放在
UPDATE a
SET a.names = b.StudentsList
FROM tableName a
INNER JOIN
(
SELECT ST2.SubjectID,
substring((SELECT ','+ ST1.StudentName
FROM dbo.Students ST1
WHERE ST1.SubjectID = ST2.SubjectID
ORDER BY ST1.SubjectID
For XML PATH ('')),2, 1000
) StudentsList
FROM dbo.Students ST2
GROUP BY ST2.SubjectID
) b ON a.SubjectID = b.SubjectID
WHERE a.SubjectID = @subjectid