Я хотел бы узнать мнение о создании агрегированных данных путем объединения строк. Если у меня есть агрегированный столбец, но я хочу выполнить конкатенацию в агрегированном столбце, что быстрее с точки зрения производительности? Выполнение одного 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 нет агрегации конкатенации строк. Кроме того, иллюстрация таблицы A слишком упрощена, обычно таблица A представляет собой сложный запрос нескольких таблиц, объединенных вместе, как и таблица B.