2012-07-04 28 views
1

我使用java java.sql。*从SQLite DB查询。我发现了一个starnge问题,即我写的SqlString为:Jave SQL executeQuery为有效的sql语句抛出错误

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已经是表2表的一部分。 SQLite命令提示符下的相同语句正常工作。但是,当我删除了开放的括号并尝试从java执行时,没有任何问题。任何想法为什么发生这种情况?

+0

您正在使用什么应用程序执行的SQL“直接”?在将用户应用程序发送到数据库服务器之前,是否有机会对输入进行一些翻译?如果数据库对完全相同的输入有不同的响应,取决于系统发送的数据,我会感到惊讶。 –

+0

我正如前面所述直接从java代码访问sqlite数据库。在java代码中只有选择的语句。没有插入/更新。 – tor

+0

我想你正在使用sqlite命令shell。你确定,你正在使用相同的版本? sqlite库通常编译到命令shell中,所以不能保证,它和你在java程序中使用的一样。例如,在版本3.6.6中,我看到了与在Java中看到的相同的错误消息,并且使用SQLite 3.7.13版,我看不到错误消息。所以,这种行为在过去已经发生了变化。 – Stefan

回答

0

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

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 
0

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

0

喜的朋友感谢您的快速响应。我能够解决这个问题。我分享这个,所以如果其他ANY1得到这个问题可以这样做:

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 ......; 

问候,托尔

+0

这正是拉胡尔的答案..请接受他的回答(以便其他人有同样的问题可以看到如何解决这个问题)。 – hage

+0

我没见过:)。所以发布我的答案!谢谢,Tor – tor