【问题标题】:Jave SQL executeQuery throws up error for valid sql statementJava SQL executeQuery 为有效的 sql 语句抛出错误
【发布时间】:2012-07-04 22:36:28
【问题描述】:

我正在使用 java java.sql.* 从 SQLite DB 进行查询。我发现了一个问题,我将 sqlString 编写为:

SELECT n.Name as Name, 
       c.Value as Value0, 
       d.Value as Value1 
FROM  (Table1 c inner join Table2 n on c.NameID = n.ID),
      Table3 d 
WHERE c.RunID = 1 
      and d.RunID = 2 
      and c.NameID = d.NameID

语句stmt.executeQuery(sqlQuery) 抛出以下异常:

java.sql.SQLException: no such column: n.Name
at org.sqlite.DB.throwex(DB.java:288)
at org.sqlite.NativeDB.prepare(Native Method)
at org.sqlite.DB.prepare(DB.java:114)
at org.sqlite.Stmt.executeQuery(Stmt.java:89).............

Name 已经是 Table2 表的一部分。同样的语句在 SQLite 命令提示符下工作正常。但是当我删除左括号并尝试从java执行时,没有问题。知道为什么会这样吗?

【问题讨论】:

  • 您使用什么应用程序“直接”执行 SQL?用户应用程序是否有可能在将输入正确发送到数据库服务器之前对其进行一些翻译?如果数据库根据发送它的系统对完全相同的输入做出不同的响应,我会感到惊讶。
  • 如前所述,我直接从 java 代码访问 sqlite db。而且java代码中只有select语句。没有插入/更新。
  • 我猜你正在使用 sqlite 命令外壳。你确定你用的是同一个版本? sqlite 库通常编译到命令 shell 中,因此不能保证它与您在 java 程序中使用的相同。例如,对于 3.6.6 版本,我看到的错误消息与您在 Java 中看到的相同,而对于 SQLite 版本 3.7.13,我看不到任何错误消息。因此,这种行为在过去发生了变化。

标签: java sqlite


【解决方案1】:

尝试这样的事情,使用子结果集

SELECT rs1.Name AS NAME, 
       rs1.Value0 AS Value0, 
       d.Value AS Value1 
FROM  (SELECT n.Name AS NAME, 
       c.Value AS Value0, 
       d.Value AS Value1 
       FROM Table1 c INNER JOIN Table2 n ON c.NameID = n.ID) rs1,
      Table3 d 
WHERE c.RunID = 1 
      AND d.RunID = 2 
      AND c.NameID = d.NameID

【讨论】:

    【解决方案2】:

    内部查询中使用的变量不能被外部引用。例如,您在内部 sql 中使用了变量 n。但是你在外面提到它。变量 n 超出了它的范围。

    【讨论】:

      【解决方案3】:

      您好朋友感谢您的快速回复。我能够解决这个问题。我正在分享这个,所以如果其他人遇到这个问题可以这样做:

      SELECT ABC.Name as Name, ABC.Value as Value0, d.Value as Value1
        FROM
        (select n.Name as Name, c.Value as Value0 from Table1 c
         inner join Table2 n on c.NameID = n.ID) AS ABC,
      Table3 d ......;
      

      问候,Tor

      【讨论】:

      • 这正是 Rahul 的回答。请接受他的回答(这样有同样问题的其他人可以看到如何解决这个问题)。
      • 我没看到 :) 。所以发布了我的答案!谢谢,托尔
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-06-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-20
      • 1970-01-01
      相关资源
      最近更新 更多