需將數據庫表 B 中與表 A 關聯(ID_RECEIVEID 相等)的所有字段(除關聯鍵外),按「字段名:值」格式拼接成字符串,存入表 A 的 AUTHDESC 字段。例如:「區域:XX;海洋:XX;...」。
使用 SQL 關聯查詢或分步查詢獲取表 B 中符合條件的記錄:
SELECT * FROM table_b WHERE id_receiveid = ?
利用 ResultSetMetaData 遍歷結果集元數據,動態構建字符串,避免硬編碼字段名:
StringBuilder sb = new StringBuilder();
ResultSetMetaData metaData = rs.getMetaData();
int columnCount = metaData.getColumnCount();
for (int i = 1; i <= columnCount; i++) {
String columnName = metaData.getColumnLabel(i);
if ("ID_RECEIVEID".equalsIgnoreCase(columnName)) continue; // 跳過關聯鍵
String value = rs.getString(i);
sb.append(columnName).append(":").append(value == null ? "" : value).append(";");
}
String authDesc = sb.length() > 0 ? sb.substring(0, sb.length() - 1) : "";
UPDATE table_a SET authdesc = ? WHERE id_receiveid = ?
public void mergeFieldsToAuthDesc(Connection conn, String receiveId) throws SQLException {
String queryB = "SELECT * FROM table_b WHERE id_receiveid = ?";
String updateA = "UPDATE table_a SET authdesc = ? WHERE id_receiveid = ?";
try (PreparedStatement psQuery = conn.prepareStatement(queryB);
PreparedStatement psUpdate = conn.prepareStatement(updateA)) {
psQuery.setString(1, receiveId);
ResultSet rs = psQuery.executeQuery();
if (rs.next()) {
StringBuilder sb = new StringBuilder();
ResultSetMetaData meta = rs.getMetaData();
int cols = meta.getColumnCount();
for (int i = 1; i <= cols; i++) {
String colName = meta.getColumnLabel(i);
if ("ID_RECEIVEID".equalsIgnoreCase(colName)) continue;
String val = rs.getString(i);
sb.append(colName).append(":").append(val != null ? val : "").append(";");
}
String authDesc = sb.length() > 0 ? sb.substring(0, sb.length() - 1) : "";
psUpdate.setString(1, authDesc);
psUpdate.setString(2, receiveId);
psUpdate.executeUpdate();
}
}
}
addBatch/executeBatch)提升性能。通過 JDBC 的 ResultSetMetaData 動態獲取字段信息,結合 StringBuilder 高效拼接字符串,可靈活實現多表字段合併需求。此方案不依賴具體字段結構,擴展性強,適合字段頻繁變動的業務場景。