【问题标题】:table.field notation with SQL Server JDBC? [duplicate]使用 SQL Server JDBC 的 table.field 表示法? [复制]
【发布时间】:2016-08-09 21:57:23
【问题描述】:

我的 SQL Server JDBC 驱动程序有问题,我尝试了 Microsoft JDBC 驱动程序和 JTDS 驱动程序,但它们都有相同的问题:如果我在 ResultSet 中查找“table.field”,则会收到错误“无效的列名”,但如果我寻找“字段”,它只会起作用。 这对我来说是个问题,因为我有一个自动生成查询并使用表示法“table.field”的应用程序,现在我已经在 MySQL 和 Postgresql 上工作过,它运行良好,但现在我需要添加 SQL Server 支持和我发现了这个问题。 这是驱动程序配置错误的问题,还是它们只能以这种方式工作? 还有其他可用的驱动程序吗?

我还发现了一个做不出来的案例,比如我创建了两个同名字段的表,在它们之间做了笛卡尔积。

表 t1,t2 是相同的,它们具有这种结构

------
| id | 
------
| 1  | 
------
| 2  | 
------

如果我执行查询

SELECT * FROM t1,t2

在 SQL Server 上,结果将是

-----------
| id | id |
-----------
| 1  | 1  |
-----------
| 1  | 2  |
-----------
| 2  | 1  |
-----------
| 2  | 2  |
-----------

但是从 Java 中使用 JDBC 驱动程序我无法获得相同的结果,因为我无法访问 t1.id、t2.id 而只能访问 id 并且它只返回第一列。

这是示例代码

Connection conn = DriverManager.getConnection("jdbc:jtds:sqlserver://localhost:1433/test", "user", "pass");         
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM t1, t2");
while(rs.next()){
    System.out.println(rs.getString("id"));   //This works
    System.out.println(rs.getString("t1.id"));//This not works
}

【问题讨论】:

  • 这个查询的结果应该是什么?你得到一个笛卡尔积。制造这种感觉?
  • 您应该在查询级别处理此问题并为 t1 和 t2 分配别名。
  • 我想这就是你要找的stackoverflow.com/questions/7224024/…
  • 延斯查询的结​​果必须是笛卡尔积,这只是一个例子来说明我遇到的问题。 @Amal 对,这正是我的情况,所以我必须为每一列添加一个别名......我更喜欢自动系统,我的意思是其他系统(例如 MySQL、Postgresql)的 JDBC 驱动程序会自动执行此操作,但没关系。 .. 谢谢! :)
  • JDBC 只要求按列标签检索,表名(或表别名)不是列标签的一部分。

标签: java sql sql-server jdbc jdbc-odbc


【解决方案1】:

不要使用 SELECT *。而不是这个,使用列名。如果出现重复名称,请使用唯一的列别名。

Connection conn = DriverManager.getConnection("jdbc:jtds:sqlserver://localhost:1433/test", "user", "pass");         
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT t1.id as col1,t2.id as col2 FROM t1, t2");
while(rs.next()){
    System.out.println(rs.getString("col1"));  

}

【讨论】:

    猜你喜欢
    • 2017-04-29
    • 2015-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-05
    • 2022-01-23
    • 2011-04-05
    相关资源
    最近更新 更多