我有三个与此SQL语句相关的表。
项目
Project_CompetitionCategory
CompetitionCategory
我想从表中检索的是ProjectRecordId, ProjectName, CompetitionCategoryName
值。
但Project
可能会参与多个Competition Category
。我需要将信息放在一行,并且竞赛要在其自己的专栏中。
以下示例
1. 1 | Project No 1 | Competition 1, Competition 2
2. 2 | Project No 2 | Competition 2, Competition 3, Competition 4
3. 3 | Project No 3 | Competition 1, Competition 4
这是我当前的SQL语句:
DECLARE @Data VARCHAR(2000)
DECLARE @pID INT
DECLARE @pName VARCHAR(300)
SELECT
@pID = Project.ProjectRecordId,
@pName = Project.ProjectName,@Data = COALESCE(@Data + ',' + CompetitionCategoryName, CompetitionCategoryName)
FROM
Project_CompetitionCategory
INNER JOIN
CompetitionCategory ON Project_CompetitionCategory.CompetitionCategoryRecordId = CompetitionCategory.CompetitionCategoryRecordId
INNER JOIN
Project ON Project_CompetitionCategory.ProjectRecordId = Project.ProjectRecordId
WHERE
Project.ProjectRecordId = 10
SELECT
@pID AS 'Project Record ID',
@pName AS 'Project Name',
@Data AS Competition,
(SELECT COUNT(ProjectRecordId) FROM Presentation WHERE ProjectRecordId = @pID) AS 'Number of Recorded Presentations'
如果我删除
WHERE Project.ProjectRecordId = 10
然后它只获取最后一个值,然后CompetitionCategory
搞砸了。
如下所示。
1. 15 | Project No 15 | Competition1, Competition 2, Competition 3, Competition 2, Competition 4
我已阅读此stackoverflow文章Concatenate many rows into a single text string?
的各种答案并用google搜索
等网站上的解决方案但是我仍然无法找到解决方案。我正在使用SQL Server 2008 R2。我是SQL的新手,想了解为什么不可能得到我想要的数据。
提前致谢。
答案 0 :(得分:0)
您拥有的表结构设计不足以查询类似的内容。您没有任何理由不能使用一对多关系结果,而不是与查询连接,如下所示:
SELECT p.ProjectRecordId, p.ProjectName, cc.CompetitionCategoryName FROM Project p JOIN Project_CompetitionCategory pcc on p.ProjectRecordId = pcc.ProjectRecordId JOIN CompetitionCategory cc on pcc.CompetitionCategoryRecordId = cc.CompetitionCategoryRecordId
您提到的查询将为您选择的projectRecordID合并表,但删除recordId将只列出表中可能的所有项目的所有类别。
DECLARE @compCat VARCHAR(1000)
SELECT @compCat = COALESCE(@compCat + ',', '') + cc.CompetitionCategoryName
FROM Project p JOIN Project_CompetitionCategory pcc on p.ProjectRecordId = pcc.ProjectRecordId JOIN CompetitionCategory cc on pcc.CompetitionCategoryRecordId = cc.CompetitionCategoryRecordId WHERE p.ProjectRecordId=10
此时@compCat将只包含项目10的竞争类别。删除项目10过滤器将生成所有项目类别的列表。为了以这种方式获得连接结果,您需要使用选择projectId的游标编写sql并将其传递给连接查询...如下所示:
DECLARE @compCat VARCHAR(1000)
DECLARE projectIdSelect CURSOR FOR SELECT ProjectRecordId FROM Project
OPEN projectIdSelect
FETCH NEXT FROM projectIdSelect INTO @projectID
WHILE @@FETCH_STATUS = 0
BEGIN
SET @compCat = ''
SELECT @compCat = COALESCE(@compCat + ',', '') + cc.CompetitionCategoryName
FROM Project p JOIN Project_CompetitionCategory pcc on p.ProjectRecordId = pcc.ProjectRecordId JOIN CompetitionCategory cc on pcc.CompetitionCategoryRecordId = cc.CompetitionCategoryRecordId WHERE p.ProjectRecordId=@vars
PRINT('Project ID: ' + @vars + ' | ' + @compCat)
END
CLOSE projectIdSelect
DEALLOCATE projectIdSelect