2012-07-04 55 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