8

我在 id 列上加入了两个表,它们看起来像:

+-------+
| users |
+----+--+---+
| id | name |
+----+------+

+-------+
| posts |
+-------+------+---------+
| id | user_id | message |
+----+---------+---------+

现在我想选择所有帖子并包含用户名,其中:

SELECT * FROM posts, users WHERE user_id = users.id

然后我尝试通过以下方式获取值:

ResultSet rs = // SQL
if(rs.next()) {
    rs.getInt("posts.id");
    ...
}

但是我SQLException在执行时得到rs.getInt("posts.id")

java.sql.SQLException: Column 'posts.id' not found.

如何使用 JDBC 和 JavaDB/Derby 作为数据库从上面的 SQL 查询中获取值?

使用 检索值时如何区分和表id中的列?userspostsResultSet

4

5 回答 5

10

您正在尝试检索该id值,但您正在使用“posts.id”来引用它。

您只需要列名或别名,而不是表名:

ResultSet rs = // SQL
if(rs.next()) {
  rs.getInt("id");
  ...
}

如果您的列名本身是“posts.id”,它会起作用,但如果您选择更新表,我建议使用下划线 (_) 而不是句点。

但是我在两个表中都有一个 id 列,我如何区分它们?


您需要指定列别名:

SELECT p.id AS post_id,
       p.name,
       u.id AS users_id, 
       p.user_id, --redundant due to relationship, omit if possible
       u.message
  FROM POSTS p
  JOIN USERS u ON u.id = p.user_id

...并在 Java 代码中引用该列别名:

ResultSet rs = // SQL
if(rs.next()) {
  rs.getInt("post_id");
  ...
}
于 2010-06-03T22:39:22.783 回答
2

解决方案1:使用别名

select u.id as uid, u.name, p.id as post_id, p.user_id, p.message from
users u inner join posts p on u.id=p.user_id

解决方案 2:删除重复的 user.id,因为您已经在 posts 表中拥有它

select p.user_id, u.name, p.id as post_id, p.message from
users u inner join posts p on u.id=p.user_id
于 2010-06-03T22:51:46.113 回答
0

别名列名

SELECT
    posts.id posts_id,
    name name,
    id id,
    user_id,
    message
FROM posts 
INNER JOIN users 
    ON posts.user_id = users.id

根据您的 sql 风格,该别名可能需要是

posts.id as posts_id
于 2010-06-03T22:54:17.170 回答
0

如何使用 JDBC 和 JavaDB/Derby 作为数据库从上面的 SQL 查询中获取值?

要获取值,您应该使用ResultSet' 列名。中使用的列名将ResultSet是原始列名或别名。

如果您ResultSet的列具有相同的名称或别名,getInt()则将返回第一个匹配项。

随着您的选择...

SELECT * FROM posts, users WHERE user_id = users.id

...rs.getInt()将仅返回 the ,posts.id因为它将是第一列。

使用 ResultSet 检索值时,如何区分 users 和 posts 表中的 id 列?

您可以为每一列使用唯一别名,也可以使用ResultSetMetaData


  • 解决方案 1:使用 SQL 别名

SQL

SELECT p.id AS post_id,
    p.name AS post_name,
    u.id AS user_id, 
    u.message AS user_message
  FROM POSTS p
  JOIN USERS u
    ON u.id = p.user_id

爪哇

ResultSet rs = // SQL
if(rs.next()) {
  rs.getInt("post_id");
  rs.getInt("user_id");
}

  • 解决方案 2:使用ResultSetMetaData

SQL

SELECT p.id
    p.name
    u.id
    u.message
  FROM POSTS p
  JOIN USERS u
    ON u.id = p.user_id

爪哇

Integer userID;
Integer postID;

ResultSetMetaData rsMeta = rs.getMetaData();
if (rs.next()) {
  for (int i = 1; i <= rsMeta.getColumnCount(); i++) {
    String table = rsMeta.getTableName(i);
    String col = rsMeta.getColumnName(i);

    if(table.equals("users") && col.equals("id")){
      userID = rs.getInt(i);
      continue;
    }

    if(table.equals("posts") && col.equals("id")) {
      userID = rs.getInt(i);
      continue;
    }
  }
}
于 2015-10-30T18:00:30.013 回答
-2

您可以通过根据列索引获取数据而不是通过列名获取数据来进一步简化这些..!! 我们从数据库中检索到的任何数据都按照 select 语句按列顺序存储在结果集中,因此与其按照列名获取数据,不如按照结果集中的列索引获取数据。

前任:

String query = " select age,num from table_abc";
ResultSet rs= statement.executeQuery(query);

while(rs.next){
   int var1= rs.getInt(1);
   int var2= rs.getInt(2);
}

这些将帮助您消除由于数据库表中的相似列名而造成的复杂性和混乱。

希望这些有帮助...

祝一切顺利..!!

于 2013-03-16T08:38:18.420 回答