2012-03-16 128 views
3

我需要從一個SQL數據庫(一些組使用SQL Server,某些Oracle等)導出數據到一個CSV,我需要連接的表中的ID在一個字符串。SQL:將一個連接表的ID集合到一個字符串

例如,我有類的表和學生表。從課程開始,我需要身份證,姓名,部分,時間以及來自學生的信息。我需要班級中的一串學生ID。結果將返回列:id,名稱,節,時間,student_ids。該「student_ids」欄應爲分隔的字符串,如:

'32,43,53,12,41' 

行輸出將結束是這樣的:

"1405,Computer Science,101,12-1:30,'32,43,53,12,41'" 

每個班的學生人數並不一致,有可能成爲一名學生,或20名學生。我想過使用使用SQL Server來獲得這些數據,或者聚集鍵臨時表while循環,但我想知道是否有使用標準SQL來做到這一點,從而使腳本可以攜帶任何方式。

注:我知道輸出格式不理想,但唯一的另一種選擇是,我們將不得不爲每個班級/學生組合提供不同的記錄,然後必須分別彙總ID。

+0

什麼樣的SQL?例如,MySQL有GROUP_CONCAT()。另外,一旦它被生成,你將如何使用它?我們可能能夠提供替代流程。 – MatBailie 2012-03-16 15:07:44

+0

@Dems不幸的是,SQL變種,幾乎總是Oracle或SQL Server的一個版本,儘管 – 2012-03-16 15:14:21

+0

@Dems此外,使用導出作爲以標準格式接收數據的一種方式,不幸的是使用額外的導出,如「class_student」不是一種選擇 – 2012-03-16 15:17:10

回答

2

不同的RDBMS有不同的方式來執行這種查詢。

如果你使用MySQL,你應該看看GROUP_CONCAT聚合函數。

在Firebird中,您有LIST聚合函數。

如果您使用的是SQL Server,則在下的SO中有一些解答的問題。通常的做法是使用FOR XML PATH構造。一個很好的例子是:SQL Query to get aggregated result in comma seperators along with group by column in SQL Server

在Oracle中有幾種方法可以做到這一點,有一篇很好的文章here

0

的回答你的問題是:沒有,它不能在標準SQL來完成。

這是因爲您試圖將多個值放入單個字段中,這違反了第一範式。

你可以做使用非標準的SQL它,但SQL會爲每個數據庫不同。

但是,您也可以在SSRS中使用Tablix(它可以使用相同的標準SQL來訪問Oracle和SQLServer中的表)。

1

如果它是SQL Server中,我傾向於做這樣的:

SELECT c.classID, c.other columns, 
STUFF((SELECT ',' + convert(varchar,StudentID) 
    FROM StudentClass sc where c.ClassId = sc.ClassID 
    FOR XML PATH('')),1,1,'') as StudentIdList 
from ClassTable c 

這是假設你有一個ClassTable其中有ClassId的ID,也同時包含StudentIdClassId一個StudentClass鏈接表。

編輯:你必須有某種表與學生和班級信息,所以兩者聯繫在一起。無論是鏈接表還是每個學生只允許一個班級,那麼0123Å可能存儲在學生表中。無論哪種方式,上述應該可以幫助你解決你的問題。

相關問題