2011-10-01 19 views
5

SQLite JDBCドライバにはバグがあるようですが、誰かが骨折したエラーを見つけられるかどうかは分かります。私は次のクエリを持っています:SQLite/JDBC内部結合

SELECT 
    SKU_ATTR_VALUE.*, 
    Product.ProductID 
FROM 
    SKU_ATTR_VALUE 
    INNER JOIN SKU 
    ON SKU_ATTR_VALUE.SkuID=SKU.SkuID 
    INNER JOIN Product 
    ON SKU.ProductID=Product.ProductID 
WHERE Product.ProductID=? 

かなり簡単です。私はこれをSQLiteデータベースブラウザで実行して、?を置き換えることができます。 1で、18行が返されます。条件に一致するのは18行だけです。しかし、これをJavaで実行して値1を渡すと、817の値が返されます。それはデカルト結合ではありません。 SKU_ATTR_VALUEには864の可能な値があります。私が得た結果には、Productの各レコードに少なくとも1つの価値があるので、何が起こっているのか本当に想像することはできません。

私はこれをしばらく見てきました。私は完全に困惑しています。グーグルでは何も変えていないようだ。はい、私は、SQLiteブラウザと同じSQLiteデータベースに対してJavaクエリを実行していると確信しています。

SQLite jarの名前はsqlitejdbc-v056.jarです。これはSQLite 3.6.14.2に基づいています。ここで

は、クエリを設定するJavaコードです:

String sql = "SELECT SKU_ATTR_VALUE.*, Product.ProductID " + 
      "FROM SKU_ATTR_VALUE " + 
      "  INNER JOIN SKU ON SKU_ATTR_VALUE.SkuID=SKU.SkuID " + 
      "  INNER JOIN Product ON SKU.ProductID=Product.ProductID " + 
      "WHERE Product.ProductID=?"; 
ps = conn.prepareStatement(sql); 
ps.setInt(1, productID); 
ResultSet rs = ps.executeQuery(); 
+0

私はしましたSKUとSKU_ATTR_VALUEテーブルを結合するときに問題があると判断しました。 SKUテーブルとPRODUCTテーブルがOKに参加します。また、NetBeansに組み込まれたデータベースブラウザにクエリをコピーすると、その問題もそこに現れました。そこで、私はON句を追加しようとしました。そして、WHERE句にs.SkuID = sav.SkuIDを追加します。これにより、NetBeans dbブラウザの問題は解決されましたが、NetBeansで実行されているコードには問題が解決されました。私はそうだと結論づけました、これはバグです、そして、私はSQLiteから離れています。私は今それを信じていない。 – dnuttle

答えて

0

this documentセクション「5.0結合」によると:あなたはこのようなクエリを書き換えしようとすることができます:

SELECT 
    SKU_ATTR_VALUE.*, 
    Product.ProductID 
FROM 
    Product, SKU, SKU_ATTR_VALUE 
WHERE 
Product.ProductID=? 
AND SKU.ProductID=Product.ProductID 
AND SKU_ATTR_VALUE.SkuID=SKU.SkuID