You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多表数据合并至单表的模板及JSP展示方案咨询

嘿,我来一步步帮你解决这两个关于多表数据合并和JSP展示的问题,都是开发中很常见的场景:

1. 多张数据表检索数据合并至单表的通用模板

多表合并数据主要分两种核心场景,对应不同的SQL实现模板:

场景1:基于关联字段的合并(最常用)

当多张表有共同的关联字段(比如你提到的Updatedby),用SQL的JOIN系列语句关联查询,把需要的字段整合到一个结果集里。常用的JOIN类型和模板如下:

内连接(仅返回两表匹配的记录)

适合只需要两张表都有对应数据的场景:

SELECT 
    t1.column1, t1.column2, 
    t2.columnA, t2.columnB
FROM table1 t1
JOIN table2 t2 ON t1.关联字段 = t2.关联字段
-- 如需关联更多表,继续追加JOIN语句即可
JOIN table3 t3 ON t1.关联字段 = t3.关联字段
WHERE 筛选条件; -- 可选,根据业务需求添加

左连接(返回左表所有记录,右表匹配不上的字段为NULL)

如果需要保留其中一张表的全部数据(哪怕另一张表没有匹配项),用左连接更合适:

SELECT 
    t1.column1, t1.column2, 
    t2.columnA, t2.columnB
FROM table1 t1
LEFT JOIN table2 t2 ON t1.关联字段 = t2.关联字段
WHERE 筛选条件;

场景2:同结构表的数据合并(数据追加)

如果多张表的字段结构完全一致,只是需要把数据合并成一个结果集,用UNION或UNION ALL:

SELECT column1, column2 FROM table1
UNION ALL -- UNION会自动去重,UNION ALL保留所有重复项,性能更高
SELECT column1, column2 FROM table2
UNION ALL
SELECT column1, column2 FROM table3;
2. 匹配Updatedby字段合并两表并在JSP展示的实现

针对你的具体需求,我会从SQL查询、后端数据获取、JSP页面渲染三个部分给出具体实现:

第一步:编写关联查询的SQL语句

假设两张表的字段对应关系如下(如果实际字段名不同,你可以自行替换):

  • ID:来自testraildumptable的id字段
  • Created By:来自testraildumptable的created_by字段
  • Estimate time:来自testraildumptable的estimate_time字段
  • Timesheet time:来自timesheet的timesheet_time字段

这里用左连接确保testraildumptable的所有记录都能展示,哪怕timesheet中没有对应Updatedby的记录:

SELECT 
    t.id AS `ID`,
    t.created_by AS `CreatedBy`,
    t.estimate_time AS `EstimateTime`,
    ts.timesheet_time AS `TimesheetTime`
FROM testraildumptable t
LEFT JOIN timesheet ts ON t.Updatedby = ts.Updatedby
-- 可选:添加WHERE条件筛选数据,比如 WHERE t.status = 'completed'

第二步:后端获取数据(以JDBC为例)

在Java后端(比如Servlet或Service类)执行SQL,把结果封装成List集合,再传到JSP页面:

import java.sql.*;
import java.util.*;

public class DataService {
    public List<Map<String, Object>> getMergedData() {
        List<Map<String, Object>> dataList = new ArrayList<>();
        String sql = "SELECT t.id AS `ID`, t.created_by AS `CreatedBy`, t.estimate_time AS `EstimateTime`, ts.timesheet_time AS `TimesheetTime` FROM testraildumptable t LEFT JOIN timesheet ts ON t.Updatedby = ts.Updatedby";
        
        // 替换成你的数据库连接信息
        String dbUrl = "jdbc:mysql://localhost:3306/your_database";
        String dbUser = "your_username";
        String dbPwd = "your_password";
        
        try (Connection conn = DriverManager.getConnection(dbUrl, dbUser, dbPwd);
             PreparedStatement pstmt = conn.prepareStatement(sql);
             ResultSet rs = pstmt.executeQuery()) {
         
            while (rs.next()) {
                Map<String, Object> row = new HashMap<>();
                row.put("id", rs.getInt("ID"));
                row.put("createdBy", rs.getString("CreatedBy"));
                row.put("estimateTime", rs.getDouble("EstimateTime"));
                // 处理可能的NULL值
                row.put("timesheetTime", rs.getObject("TimesheetTime") != null ? rs.getDouble("TimesheetTime") : null);
                dataList.add(row);
            }
        } catch (SQLException e) {
            e.printStackTrace();
            // 实际项目中建议抛出自定义异常或记录日志
        }
        return dataList;
    }
}

然后在Servlet中把数据放到request域,转发到JSP:

import javax.servlet.*;
import javax.servlet.http.*;
import java.io.IOException;
import java.util.List;
import java.util.Map;

public class DataServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        DataService service = new DataService();
        List<Map<String, Object>> mergedData = service.getMergedData();
        request.setAttribute("mergedData", mergedData);
        // 转发到你的JSP页面
        request.getRequestDispatcher("/mergedTable.jsp").forward(request, response);
    }
}

第三步:JSP页面渲染表格

在JSP页面中用JSTL标签遍历数据,渲染你需要的表格结构(注意先引入JSTL标签库,需要提前添加JSTL的jar包到项目中):

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
    <title>Merged Data Table</title>
    <style>
        table { width: 100%; border-collapse: collapse; margin-top: 20px; }
        th, td { border: 1px solid #ddd; padding: 10px; text-align: left; }
        th { background-color: #f5f5f5; font-weight: bold; }
    </style>
</head>
<body>
    <h2>Merged Testrail & Timesheet Data</h2>
    <table>
        <tr>
            <th style="width: 20%">ID</th>
            <th style="width: 20%">Created By</th>
            <th style="width: 20%">Estimate time</th>
            <th style="width: 20%">Timesheet time</th>
            <th style="width: 20%"></th> <!-- 预留空列,可添加操作按钮等 -->
        </tr>
        <!-- 遍历数据渲染行 -->
        <c:forEach items="${mergedData}" var="row">
            <tr>
                <td>${row.id}</td>
                <td>${row.createdBy}</td>
                <td>${row.estimateTime != null ? row.estimateTime : 'N/A'}</td>
                <td>${row.timesheetTime != null ? row.timesheetTime : 'N/A'}</td>
                <td>
                    <!-- 可添加编辑/删除按钮等操作,比如: -->
                    <!-- <button onclick="editRow(${row.id})">Edit</button> -->
                </td>
            </tr>
        </c:forEach>
    </table>
</body>
</html>

内容的提问来源于stack exchange,提问作者iltech

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:28:34