2009-11-11 47 views
0

我想通過串聯字符串來獲取有關製作聚合數據的意見。如果我有一個列聚合,但我想在一個聚合列中進行連接,而這在性能方面更快?做一個SQL,然後在CODE中彙總。或者選擇主要數據,然後每次查詢一個數據。在SQL或CODE(性能方面)中更好地分組聚合的數據

例如:

TABLE_A   
COL_A_1   COL_A_2 
A    a 
B    b 
C    c 

TABLE_B 
COL_B_1   COL_B_2 
a    Text1 
a    Text2 
a    Text3 
b    Text4 
b    Text5 

表在COL_A_2 = COL_B_1接合,所述聚集體列是COL_B_2。

選項1(做一個SQL)

SELECT TABLE_1.COL_A_1, TABLE_1.COL_A_2, TABLE_2.COL_B_2 
FROM TABLE_A 
LEFT OUTER JOIN TABLE_B ON TABLE_A.COL_A_2 = TABLE_2.COL_B_1 
ORDER BY TABLE_1.COL_A_1 

然後在的代碼,對結果只是循環設定和聚集COL_B_1。 (例如使用Java)

String oldColA1 = ""; 
InfoEntity currInfo = null; 
for (InfoEntity info : infoList) { 
    if (!oldColA1.equals(info.colA1)) { 
    currInfo = info; 
    } 

    if (currInfo.colB2 == null || currInfo.colB2.equals("")) { 
    currInfo.colB2 = info.colB2; 
    } else { 
    currInfo.colB2 += info.colB2; 
    } 
    oldColA1 = info.colA1; 
} 

選項2(做幾個SQL)

SELECT TABLE_1.COL_A_1, TABLE_1.COL_A_2 
FROM TABLE_A 
ORDER BY TABLE_1.COL_A_1 

然後對於每個代碼選擇(防爆的Java)

for (InfoEntity info : infoList) { 
    // Select TableB entity based on info.colA2 
    ... 
    tableBList = dao.selectTableB(info.colA2); 
    ... 
    for (TableBEntity b : tableBList) { 
    info.colB2 += b.colB2; 
    } 
} 

我通常選擇1 ,因爲我認爲選擇多個SQL可能代價很高。但我不確定這一點。但是有沒有另外一種方法來進行這種聚合。我已經搜索了網絡,並且在標準SQL中沒有字符串連接聚合。另外,TableA上的插圖已經過於簡化了,通常TableA是一個連接在一起的多個表的複雜查詢,TableB也是如此。

回答

3

我通常會做選項1,因爲我認爲製作多個SQL選擇代價高昂。

你是對的 - 旅行到數據庫應該儘可能少。

組連接是可能的 - MySQL自從4.1以來有GROUP_CONCAT。使用SQL Server,你可以使用:

SELECT @out = COALESCE(@out + ',' + t.column, t.column) 
    FROM TABLE t 

檢查this link爲應在Oracle 9i +工作的例子。