Znalazłem coś, co wydaje się być błędem w sterowniku JDBC SQLite, ale pomyślałem, że zobaczę, czy ktoś może wykryć jakiekolwiek błędy kościane z mojej strony. Mam następujące zapytanie:Łączenie wewnętrzne 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=?
Całkiem proste. Mogę uruchomić to w przeglądarce bazy danych SQLite, zastępując? z 1, i zwraca 18 wierszy, co jest właśnie tym, co powinien zrobić. Tylko 18 wierszy spełnia warunek. Ale kiedy uruchamiam to w Javie i przekazuję wartość 1, otrzymuję 817 wartości z powrotem. I to nie jest kartezjańskie połączenie; istnieje 864 możliwych wartości w SKU_ATTR_VALUE. Otrzymane wyniki mają co najmniej jedną wartość dla każdego rekordu w Produkcie ... więc naprawdę nie mogę sobie wyobrazić, co się dzieje.
Patrzyłem na to przez chwilę i jestem kompletnie zakłopotany. Googling nie wydaje się niczego zmieniać. Tak, jestem pewien, że używam zapytania Java w tej samej bazie danych SQLite, co w przeglądarce SQLite.
Nazwa słoika SQLite to sqlitejdbc-v056.jar. Oparty jest na SQLite 3.6.14.2.
Oto kod Java, który ustawia zapytanie:
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();
mam z tym, że problem występuje, gdy dołączam do tabel SKU i SKU_ATTR_VALUE. Tabele SKU i PRODUCT dołączają się do OK. Widziałem również, że kiedy skopiowałem zapytanie do przeglądarki bazy danych wbudowanej w NetBeans, pojawił się tam również problem. Tak więc próbowałem dodać zarówno klauzulę ON, a także dodać s.SkuID = sav.SkuID w klauzuli WHERE. Naprawiono problem w przeglądarce db NetBeans, ale nie w kodzie (który działa w NetBeans). Doszedłem do wniosku, że tak, to jest błąd i odchodzę od SQLite. Nie ufam temu teraz. – dnuttle