PHP odbc_exec 未返回所有行

PHP odbc_exec not returning all rows

这个简单的查询

SELECT 
    DBA.Goods.ID,  /* PK in the Goods table */
    DBA.Goods.Name,
    DBA.GoodsGroup.Name as GdGrp,
    DBA.InvoiceItem.Qty,
    DBA.InvoiceItem.ID,   /* PK in the InvoiceItem table */
    DBA.InvoiceItem.PrintName,
    DBA.InvoiceItem.Price,
    DBA.InvoiceItem.InvoiceID, /* PK in the Invoice table, a parent table of a sort */
    DBA.InvoiceItem.InvoiceItemOrder,
    DBA.InvoiceItem.ProcPrice,
FROM (
    DBA.Goods INNER JOIN DBA.InvoiceItem
        ON DBA.Goods.GoodsSk = DBA.InvoiceItem.GoodsSK
)
INNER JOIN DBA.GoodsGroup
    ON DBA.Goods.GroupID = DBA.GoodsGroup.ID
WHERE DBA.InvoiceItem.InvoiceID = $invoiceID /* ID of a specific invoice, used here to get to its contents, i.e. specific items within that invoice */

当在 DBExplorer(用于执行原始 SQL 查询的数据库工具)中 运行 时,returns 5 行(发票内容)。一切都以这样一种方式设置,即一张发票可能包含多个具有相同 ID 的商品(但具有不同的价格和采购价格、印刷名称——例如 bucket-white、bucket-blue、bucket-red 等)。每个项目在 Items table 中都有一个唯一的 ID。上述5行为预期结果(即列表中的商品为实际售出商品)

但是,当查询通过以下方式发送到数据库时:

$result = odbc_exec($conn,$query);

odbc_num_rows($results) 不是 5,如预期和在 DBExplorer 中看到的那样,而是 3 -(感知到的)重复项未 returned(在上一个示例中的所有存储桶中,只有一个是returned).

此外,在使用

遍历结果时
while($rowItems = odbc_fetch_object($result) {
    ...
}

只有 3 次迭代,而不是预期的 5 次。

考虑到列顺序可能会导致问题(我知道这很愚蠢),我将 DBA.InvoiceItem.ID 移到了顶部,使其成为结果集中的第一列。然而,那没有任何作用。

为什么会这样,我怎样才能使它成为 return 完整的结果集?

备注

我知道在 SO 上也有类似的问题:

php odbc_exec not returning all results

why doesn't this code return all rows?

Not getting all rows from a query with odbc_exec in php

但其中 none 实际上解决了这里提出的问题 - 如何获取在数据库工具中看到的所有行,而不是减少的结果集。

问题出在查询上。一旦我通过更改加入顺序来更改它,一切都会按预期进行。关键是让 DBA.InvoiceItem 成为主要的 table,并将所有内容加入其中。我仍然不知道(清楚)为什么会这样。