如何从Java中的sqlite中选择多个表?

时间:2014-08-02 20:07:47

标签: java sqlite inner-join

我试图学习如何在java程序中使用sqlite数据库。 (不是Android)。我转到this链接,下载了jdbc库并复制了示例。该示例正常运行。然后我将另一个表添加到数据库中,并且想要连接两个表并从每个表中选择一列。我在从数据库no such column: 'person.name'进行查询的行上收到错误。我已经尝试了很多不同的方式来加入表格并选择,但每次我在Table.columnName上获得例外。有人能告诉我在sqlite中连接两个表的正确语法吗?这是我的代码:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class Sample
{
  public static void main(String[] args) throws ClassNotFoundException
  {
    // load the sqlite-JDBC driver using the current class loader
    Class.forName("org.sqlite.JDBC");

Connection connection = null;
try
{
  // create a database connection
  connection = DriverManager.getConnection("jdbc:sqlite:newSample.db");
  Statement statement = connection.createStatement();
  statement.setQueryTimeout(30);  // set timeout to 30 sec.

  statement.executeUpdate("drop table if exists person");
  statement.executeUpdate("drop table if exists purchase");
  statement.executeUpdate("create table person (id integer, name string)");
  statement.executeUpdate("create table purchase (id integer, name string)");
  statement.executeUpdate("insert into purchase values(1, 'shampoo')");
  statement.executeUpdate("insert into purchase values(1, 'cheese')");
  statement.executeUpdate("insert into purchase values (2, 'cherries')");
  statement.executeUpdate("insert into purchase values (3, 'yogurt')");
  statement.executeUpdate("insert into purchase values (3, 'butter')");
  statement.executeUpdate("insert into person values(1, 'leo')");
  statement.executeUpdate("insert into person values(2, 'yui')");
  statement.executeUpdate("insert into person values(3, 'Steve')");
  ResultSet rs = statement.executeQuery("select purchase.name, person.name from 
  purchase inner join person on person.id = purchase.id"); <-- This is where I get the error!!

  while(rs.next())
  {
    // read the result set
    System.out.println("name = " + rs.getString("person.name"));
    System.out.println("id = " + rs.getInt("person.id"));
    System.out.println("purchase = " + rs.getString("purchase.name"));
  }
}
catch(SQLException e)
{
  // if the error message is "out of memory", 
  // it probably means no database file is found
  System.err.println(e.getMessage());
}
finally
{
  try
  {
    if(connection != null)
      connection.close();
  }
  catch(SQLException e)
  {
    // connection close failed.
    System.err.println(e);
  }
}

} }

2 个答案:

答案 0 :(得分:1)

SQLite documentation说:

  

如果存在AS子句,则结果列的名称是该列的“AS”子句的值。如果没有AS子句,那么列的名称是未指定的,可能会从SQLite的一个版本更改为下一个。

您应该使用SQLite碰巧使用的列名:

rs.getString("name")

或给结果列一个唯一的名称:

executeQuery("select person.name AS person_name, ...")
rs.getString("person_name")

或只使用列索引:

rs.getString(1)

答案 1 :(得分:0)

您应该为表名定义别名,如下所示

select pc.name, ps.name from purchase as pc inner join person as ps on ps.id = pc.id