0

我想就通过连接字符串来制作聚合数据征求意见。如果我有一个列聚合但我想在聚合列中连接,那么在性能方面哪个更快?执行一个 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

然后在代码中为每个选择(Ex 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 也是如此。

4

1 回答 1

3

我通常做选项 1,因为我认为进行多个 SQL 选择的成本很高。

你是对的 - 访问数据库应该尽可能少。

不过,组连接是可能的 - MySQL 从 4.1 开始就有GROUP_CONCAT。使用 SQL Server,您可以使用:

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

检查此链接以获取应在 Oracle 9i+ 中工作的示例。

于 2009-11-11T02:22:33.667 回答