使用JDBC从多个表中进行SELECT时,如何识别列?

时间:2010-06-03 22:32:51

标签: sql jdbc join resultset javadb

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

+-------+
| 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检索值时,如何区分usersposts表格中的ResultSet列?

5 个答案:

答案 0 :(得分: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");
  ...
}

答案 1 :(得分: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

答案 2 :(得分: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

答案 3 :(得分:0)

  

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

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

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

选择...

getInt()

... SELECT * FROM posts, users WHERE user_id = users.id 将仅返回rs.getInt(),因为它将是第一列。

  

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

您可以为每列使用唯一的别名,也可以使用posts.id

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

SQL

ResultSetMetaData

爪哇

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
  • 解决方案2: 使用ResultSet rs = // SQL if(rs.next()) { rs.getInt("post_id"); rs.getInt("user_id"); }

SQL

ResultSetMetaData

爪哇

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

答案 4 :(得分:-2)

您可以通过按列索引获取数据而不是按列名获取数据来进一步简化这些操作。!!我们从DB检索的数据是按照列顺序按照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);
}

这些将帮助您消除由于数据库表中类似的列名而产生的复杂性和混淆。

希望这些有帮助...

一切顺利...... !!

相关问题