SQLite/JDBC 内连接

Posted

技术标签:

【中文标题】SQLite/JDBC 内连接【英文标题】:SQLite/JDBC inner join 【发布时间】:2011-10-01 14:20:08 【问题描述】:

我发现似乎是 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。

这是设置查询的 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 db 浏览器中的问题,但没有解决代码(在 NetBeans 中运行)中的问题。我得出的结论是,是的,这是一个错误,我正在远离 SQLite。我现在不相信它。 【参考方案1】:

根据this document“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 

【讨论】:

以上是关于SQLite/JDBC 内连接的主要内容,如果未能解决你的问题,请参考以下文章

jmeter通过org.sqlite.JDBC驱动连接db数据库

JDBC连接数据库

JAVA_JDBC连接数据库

SQL中内连接和外连接的区别

MySQL连接查询 内连接和外连接的区别

SQL内连接与外连接用法与区别