我试图学习如何在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);
}
}
} }
答案 0 :(得分:1)
如果存在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