java - 从数据库中的多个表中检索数据

标签 java jdbc

我的数据库中有一些表。他们有一些特定的模式。例如,假设我有表员工,然后是具有相同模式的其他表,例如:

table 1:employee
table 2:employee_X
table 3:employee_Y

我想检查这些表是否包含数据,如果包含,那么我必须为每个表调用一些方法。我正在使用以下代码来检索。

DatabaseMetaData meta = con.getMetaData();
ResultSet res = meta.getTables(null, null, "My_Table_Name", new String[] {"TABLE"});
while (res.next()) {

    if(rs.getStrin(3).equals(employee)){
        //my code to write data of this table to a file
    }

    if(rs.getString(3).equals(employee_X)){
        //my code to write data to the same file

    }

    if(rs.getString(3).equals(employee_Y)){
        //code to write data to the same file from this table
    }
}

代码工作正常,但我如何一次从所有这些表中检索数据而不是使用三个检查。如果这些表中的任何一个包含数据,我想将其写入我的文件。如何以更少的代码行高效地执行此操作?

如果有人可以建议如何在单个语句中检查每个表是否包含数据,然后我可以调用我的代码将数据写入文件,那就太好了。

最佳答案

您可以在复杂查询中使用UNION 语句。请检查示例:

SELECT id, name FROM employee WHERE id = ?
    UNION
SELECT id, name FROM employee_x WHERE id = ?
    UNION
...

您还可以使用UNION ALL 语句代替UNION。主要区别是 UNION 返回不重复的唯一结果集,UNION ALL 允许重复。请检查此链接 https://www.w3schools.com/sql/sql_union.asp有关 union 语句的详细说明。

如果您需要使用自定义过滤表创建UNION查询,请检查示例:

Set<String> requiredTables = new HashSet<>();
// fill set with required tables for result query
requiredTables.add("employee");
ResultSet res = meta.getTables(null, null, "My_Table_Name", 
 new String[] {"TABLE"});

List<String> existentTables = new LinkedList<>();
while(res.next()) {
    if (requiredTables.contains(res.getString(3)) {
        existentTables.add(res.getString(3)); 
    }
}

String query = existentTables.stream().map(table -> String.format("SELECT * FROM %s", table)).collect(Collectors.joinning(" UNION "));

关于java - 从数据库中的多个表中检索数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46372362/

相关文章:

java - getGenerateKeys 返回一个空的 ResultSet

java - createStatement()方法如何返回Statement对象?

concurrency - 为什么并发控制使用经典的二条件算法

java - 从 Java 启动的 Perl 需要永远

java - 打印出映射的键和值

java - CNF:删除一些弹出选项(来自平台贡献的选项)

java - Confluence 用户宏在升级中损坏

java - 嵌入 Tomcat : NoInitialContextException when trying to get a DataSource

java - 如何将子选择与PreparedStatements 结合使用?

sql - HSQLDB: "invalid datetime format"用于 dd/mm/yyyy 但不适用于 yyyy-mm-dd