2011-10-01 4 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 개의 가능한 값이 있습니다. 내가 얻은 결과는 Product의 각 레코드에 대해 적어도 하나의 가치가 있습니다. 그래서 나는 실제로 어떤 일이 일어나고 있는지 상상할 수 없습니다.

나는 이것에 대해 잠시 들여다 보았고 나는 완전히 난처 해했다. 인터넷 검색은 아무 것도 켜는 것처럼 보이지 않습니다. 예, 저는 SQLite 브라우저에서와 동일한 SQLite 데이터베이스에 대해 Java 쿼리를 실행하고 있다고 확신합니다.

SQLite jar의 이름은 sqlitejdbc-v056.jar입니다. 이것은 SQLite 3.6.14.2를 기반으로합니다.

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

내가했습니다 furthered는 SKU 및 SKU_ATTR_VALUE 테이블을 조인 할 때 문제가 있음을 확인했습니다. SKU W PRODUCT 테이블이 OK에 들어갑니다. NetBeans에 내장 된 데이터베이스 브라우저에 쿼리를 복사 할 때도 문제가 나타났습니다. 그래서 나는 ON 절을 추가하려고 시도했고 WHERE 절에 s.SkuID = sav.SkuID를 추가했습니다. 이 문제는 NetBeans db 브라우저에서 수정되었지만 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