gpt4 book ai didi

java - 在 SQL 或 CODE 中更好地对聚合数据进行分组(就性能而言)

转载 作者:行者123 更新时间:2023-12-02 00:54:03 24 4
gpt4 key购买 nike

我想征求关于通过连接字符串来生成聚合数据的意见。如果我有一个列聚合,但我想在聚合列中连接,哪个在性能方面更快?执行一条 SQL,然后在代码中聚合。或者选择主要数据然后一次查询一个。

例如:

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 也是如此。

最佳答案

I usually do option 1, because I think making multiple SQL select is costly.

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

尽管如此,组串联是可能的 - MySQL 有 GROUP_CONCAT ,从 4.1 开始。通过 SQL Server,您可以使用:

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

检查this link一个应该在 Oracle 9i+ 中工作的示例。

关于java - 在 SQL 或 CODE 中更好地对聚合数据进行分组(就性能而言),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1712397/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com