SQLite / JDBC внутреннее соединение - PullRequest
5 голосов
/ 01 октября 2011

Я обнаружил ошибку в драйвере 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 возможных значения. У результатов, которые я получаю, тоже есть хотя бы одно значение для каждой записи в Продукте ... поэтому я действительно не могу себе представить, что происходит.

Я смотрю на это некоторое время, и я полностью в замешательстве. Погуглив, похоже, ничего не происходит. Да, я уверен, что выполняю запрос Java к той же базе данных SQLite, что и в браузере SQLite.

Имя jar-файла SQLite - 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();

1 Ответ

0 голосов
/ 27 сентября 2012

Согласно этому документу раздел "5.0 Joins": вы можете попробовать переписать ваш запрос следующим образом:

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 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...