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();
我已經進一步確定問題出在我加入SKU和SKU_ATTR_VALUE表時。 SKU和PRODUCT表加入OK。我還看到,當我將查詢複製到內置於NetBeans中的數據庫瀏覽器時,問題也出現在那裏。所以然後我嘗試添加一個ON子句,並且在WHERE子句中添加s.SkuID = sav.SkuID。這解決了NetBeans數據庫瀏覽器中的問題,但是不在代碼中(在NetBeans中運行)。我已經得出結論,是的,這是一個錯誤,我正在離開SQLite。我現在不信任它。 – dnuttle