2012-07-30 64 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