2011-10-01 81 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個可能的值。我得到的結果至少對於產品中的每個記錄都有一個值...所以我真的無法想象發生了什麼。

我一直在看這一段時間,我完全難倒了。谷歌搜索它似乎並沒有改變任何事情。是的,我確定我正在使用與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數據庫瀏覽器中的問題,但是不在代碼中(在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