【问题标题】:Using ResultSetMetaData with same column name in 2 tables [duplicate]在 2 个表中使用具有相同列名的 ResultSetMetaData [重复]
【发布时间】:2015-09-05 09:56:34
【问题描述】:

我想从 2 个表中获取列名,然后使用 ResultSetMetaDataResultSet 获取它们的值。假设表 myTable 有 x、y 和 z 列。我愿意

 Select * from table myTable A,myTable B where A.x = B.y

我想在我的代码中使用 B.z 的值。

ResultSetMetaData 会将列列为 x y z x y z ,那么如何区分 z 的值与别名 A 和 B?

我需要在查询中使用 *,因为它可以提高我的性能。所以我不能在那里提到列名。有什么方法可以使用ResultSet 的列名获取列 B.z 的值?我的意思是ResultSetMetaData 有没有办法将列列为 A.x、A.y、A.z、B.x、B.y 和 B.z?

【问题讨论】:

  • 我认为您认为SELECT * 提供比SELECT col,col,col 更好的性能的假设是错误的。
  • 它不是假设......它是我的大表和大数据的实际用例。

标签: java sql database sybase resultset


【解决方案1】:

如果您不能或不想指定列名(带有别名),那么您需要按索引检索值,而不是按列标签。 ResultSet API doc 明确表示:

当使用一个列名调用 getter 方法并且多个列具有同名时,将返回第一个匹配列的值。列名选项设计为在生成结果集的 SQL 查询中使用列名时使用。 对于查询中未明确命名的列,最好使用列号。 如果使用列名,程序员应注意保证它们唯一地引用预期的列,这可以使用 SQL AS 子句可以放心。

(强调我的)

如果您想区分列,那么您可以使用ResultSetMetaData.getTableName,但它不会帮助您进行检索(除非找到要使用的“正确”索引)。请注意,并非所有数据库都支持提供表名。

【讨论】:

  • 这就是我目前正在做的索引方式..我想如果有开箱即用的东西..会很好..无论如何还是非常感谢...
  • @user1107108 不幸的是,没有办法做到这一点:API 明确表示没有如上所示。
【解决方案2】:

看起来更像是JDBC ResultSet get columns with table alias

使用 rs.getMetaData().getTableName(colid) 提供每列的表名,您必须生成自己的哈希图,其中键作为表名,值作为列名列表。

【讨论】:

    猜你喜欢
    • 2013-04-19
    • 1970-01-01
    • 2010-11-15
    • 2018-05-11
    • 1970-01-01
    • 2012-09-13
    • 1970-01-01
    • 2017-03-04
    相关资源
    最近更新 更多