SQLite/JDBC 内连接

发布于 2024-12-07 16:49:26 字数 1111 浏览 0 评论 0原文

我发现了 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 个可能的值。我得到的结果对于产品中的每条记录也至少有一个值......所以我真的无法想象发生了什么。

我已经看这个有一段时间了,我完全被难住了。谷歌搜索似乎没有发现任何东西。是的,我确信我正在针对与 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();

I have found what appears to be a bug in the SQLite JDBC driver, but I thought I'd see if someone could spot any boneheaded errors on my part. I have the following query:

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=?

Pretty simple. I can run this in the SQLite database browser, replacing the ? with 1, and it returns 18 rows, which is just what it should do. Only 18 rows match the condition. But when I run this in Java, and pass in the value 1, I get 817 values back. And that's not a Cartesian join; there are 864 possible values in SKU_ATTR_VALUE. The results I get back have at least one value for each record in Product too...so I really can't imagine what is happening.

I've been looking at this a while and I'm completely stumped. Googling it doesn't seem to turn anything up. Yes, I'm sure that I'm running the Java query against the same SQLite database as in the SQLite browser.

The name of the SQLite jar is sqlitejdbc-v056.jar. It is based on SQLite 3.6.14.2.

Here is the Java code that sets up the query:

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

此岸叶落 2024-12-14 16:49:26

根据本文档部分“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 

According to this document section "5.0 Joins" : you can try to rewrite your query like this :

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 
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文