2012-07-30 62 views
0

我有三个与此SQL语句相关的表。并置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 

我已阅读各种回答这个计算器文章Concatenate many rows into a single text string?

和谷歌搜索找到的网站,如

  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/

的解决方案。然而我还是canno找到解决办法。我正在使用SQL Server 2008 R2。我是SQL新手,想了解为什么无法获取我想要的数据。

在此先感谢。

+0

这种基于可变GROUP_CONCAT工程仅单个记录输出。如果你需要分组数据,[看看xml路径('')解决方案](http://stackoverflow.com/questions/451415/simulating-group-concat-mysql-function-in-ms-sql-server -2005)。 – 2012-07-30 13:52:05

回答

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 

你提到会concatinate表为您选择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过滤器将导致列出所有项目的类别。为了得到连接后的结果这样一来,你就需要编写使用游标的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 [email protected] 
    PRINT('Project ID: ' + @vars + ' | ' + @compCat)  
END 
CLOSE projectIdSelect 
DEALLOCATE projectIdSelect