2011-10-01 17 views
5

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(); 
+0

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

Odpowiedz

0

Według this document rozdziale „5.0 dołącza”: można spróbować przepisać zapytanie tak:

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