JDBC 从选择结果集中选择

Posted

技术标签:

【中文标题】JDBC 从选择结果集中选择【英文标题】:JDBC Select from Select ResultSet 【发布时间】:2013-11-17 12:20:14 【问题描述】:

这是我的桌子:

table Paciente
+------------------------------------+
|   Nome   |   RG   |   ID_Paciente  |
+------------------------------------+
|  Lucas   |  10101 |        1       |
+------------------------------------+

table Telefone
+---------------------------------------------------------+
|  DDD   |   Telefone   |   ID_Paciente  |   ID_Telefone  |
+---------------------------------------------------------+
|   41   |   123456789  |        1       |       1        |
+---------------------------------------------------------+

我需要从 Telefone 表中打印 DDD 和 Telefone。

我正在尝试做这样的事情:

String sql = "select ID_Paciente from Paciente where Nome = '"+nome+"'";
PreparedStatement st = c.getConnection().prepareStatement(sql);

ResultSet res = st.executeQuery();

sql = "select DDD from Telefone where ID_Paciente = '"+res.getString(1)+"'";
st = c.getConnection().prepareStatement(sql);

res = st.executeQuery();

while(res.next())
   
      System.out.println("  DDD: "+res.getString(1));

但是,它不起作用

有什么帮助吗?

【问题讨论】:

将 res.next() 放在第二个 sql 语句之前 定义“它不工作”。发生什么了?您得到的异常包含一条有意义的消息,旨在被阅读。另外,请重新阅读有关 ptepared 语句的教程,因为您错过了重点,即能够安全地绑定参数,而不使用字符串连接。 为什么不加入查询而不是触发两个不同的选择语句? 我很担心,如果 paciente 是我认为的那样,这不是家庭作业。 【参考方案1】:

虽然我可以回答您的问题,但我认为分别触发两个 select 语句并不是一个好方法。您可以组合语句并触发一个查询:

"select DDD from Telefone where ID_Paciente in (select ID_Paciente from Paciente where Nome = '"+nome+"')"

【讨论】:

【参考方案2】:

你需要这样的东西(未经测试):

final String sql = "SELECT t.DDD, t.Telefone FROM Telefone t" + 
                   " LEFT JOIN Paciente p ON (t.ID_Paciente = p.ID_Paciente)" + 
                   " WHERE p.Nome = ?";
Connection con = null;
PreparedStatement stm = null;
ResultSet rs = null;

try 
    con = c.getConnection();
    stm = con.prepareStatement(sql);
    stm.setString(1, nome);

    rs = stm.executeQuery();

    while (rs.next()) 
        System.out.println(String.format("DDD = %d, Telefone = %s", 
            rs.getLong(1), rs.getString(2)));
    
 catch (final SQLException e) 
    // TODO handle exception
    e.printStackTrace();
 finally 
    try 
        if (rs != null) 
            rs.close();
        
        if (stm != null) 
            stm.close();
        
        if (con != null) 
            con.close();
        
     catch (final SQLException e) 
        // ignore
    

【讨论】:

【参考方案3】:

你可以使用 join 代替 2 个执行查询

SELECT Telefone.DDD, Telefone.Telefone, 
FROM Telefone
INNER JOIN Paciente
ON Telefone.ID_Paciente=Paciente.ID_Paciente;


String sql = "SELECT Telefone.DDD, Telefone.Telefone, 
    FROM Telefone
    INNER JOIN Paciente
    ON Telefone.ID_Paciente=Paciente.ID_Paciente where Paciente.Nome=?";
PreparedStatement st = c.getConnection().prepareStatement(sql);
st.setString(1,nome);
ResultSet res = st.executeQuery();
while(res.next())

//your code to retrieve

【讨论】:

以上是关于JDBC 从选择结果集中选择的主要内容,如果未能解决你的问题,请参考以下文章

JDBC 从选择结果集中选择

使用 sql server 从 jdbc 中的结果集中转到最后一行

分页结果集中的选择子查询或左外连接哪个更快

sql 将单元ID和“硬编码”数据选择到查询结果集中,该结果集可以粘贴到sql开发人员中,用于缺少特定单元的单元

Java JDBC Single Statement 对象在 while 循环之前和 while 循环内

JDBC:如何从结果集中检索 SQL COUNT 函数的结果?