连接SQL表但只检索一个?

时间:2012-07-30 13:31:51

标签: sql sql-server-2008-r2

我有三个与此SQL语句相关的表。

项目

  • ProjectRecordId
  • 项目名

Project_CompetitionCategory

  • ProjectCompetitionCategoryRecordId
  • ProjectRecordId
  • CompetitionCategoryRecordId

CompetitionCategory

  • CompetitionCategoryRecordId
  • CompetitionCategoryName

我想从表中检索的是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搜索

等网站上的解决方案
  1. http://databases.aspfaq.com/general/how-do-i-concatenate-strings-from-a-column-into-a-single-row.html
  2. http://www.simple-talk.com/sql/t-sql-programming/concatenating-row-values-in-transact-sql/
  3. 但是我仍然无法找到解决方案。我正在使用SQL Server 2008 R2。我是SQL的新手,想了解为什么不可能得到我想要的数据。

    提前致谢。

1 个答案:

答案 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