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 内连接的主要内容,如果未能解决你的问题,请参考以下文章