0

编辑:没关系,想通了,如果您有兴趣,请在下面回答。

使用 Postgresql 8.4。

这是我需要运行的查询的格式(名称和面孔已更改以保护我的妄想症。如有必要,可以提供它们,但这是我的查询的直接副本,只需简单地替换模式、表和列名):

SELECT
    t1.field,
    SUM(v3.quantity) as current_qty
FROM
    schema1.child_table t1
        JOIN (SELECT DISTINCT t1key FROM schema2.child_transaction t2 WHERE datefield BETWEEN '2012-04-01' AND '2012-04-19') t2 USING (t1key)
        LEFT JOIN schema1.child_current_status v3 ON t1.t1key = v3.t1key
        JOIN schema1.parent_table t4 ON t1.t4key = t4.t4key
WHERE
    t4.criteria = 763
GROUP BY
    t1.field

...基本上,我需要fieldfrom child_tablewhencriteria匹配我在 中提供的数据,并且在请求期间parent_table至少有一项相关交易。child_transaction如果视图中有数量child_current_status,我们也需要这些数量。

t1.field可以认为是人类可读的等价于数字键t4.criteria

child_current_status我的问题是,即使那里有数据,所提供的查询也无法提供数量数据。

编辑:澄清一下,上面的查询返回field, NULL,它应该返回的位置field, current_qty

问题与t2子查询有关,因为当我将其更改为 a 时LEFT JOIN,它会返回相关的数量数据:

SELECT
    t1.field,
    SUM(v3.quantity) as current_qty
FROM
    schema1.child_table t1
        LEFT JOIN (SELECT DISTINCT t1key FROM schema2.child_transaction t2 WHERE datefield BETWEEN '2012-04-01' AND '2012-04-19') t2 USING (t1key)
        LEFT JOIN schema1.child_current_status v3 ON t1.t1key = v3.t1key
        JOIN schema1.parent_table t4 ON t1.t4key = t4.t4key
WHERE
    t4.criteria = 763
GROUP BY
    t1.field

编辑:此修改后的查询返回,但无论在请求的时间段内field, current_qty是否有交易都会这样做child_transaction

...我所做的只是将第一个 JOIN 转换为 LEFT JOIN,然后该查询返回child_current_status. 如果我将 更改child_current_status为 INNER JOIN,则查询不会返回任何内容。将第一个 JOIN 设置为 LEFT JOIN 的问题在于,我需要它仅在子查询返回数据时才返回结果,在这种情况下是针对请求的时间段。

为了搅浑水,它适用于某些 t4.criteria人,763 只是它失败的一个。

我在这里想念什么?


简短版本:从上面的第一个查询中,当第一个 JOIN 是一个 INNER JOIN 时,它会导致 LEFT JOIN 什么都不返回。当它是 LEFT JOIN 时,LEFT JOINchild_current_status返回正确的数据,但这否定了第一个 JOIN 的目的。

编辑:我尝试将 LEFT JOIN 移动到 FROM 子句的末尾,在 INNER JOIN 后面,没有任何变化

4

1 回答 1

0

呃,没关系,我想通了,查询工作正常,这里没有足够的数据让其他人想通。基本上, 中的一个孩子有一笔交易, 中的child_table其他孩子有当前数量child_table。因此,该查询适当地指示在指定父级的指定时间内有交易的任何子级没有当前数量。

出现问题是因为在处理此查询的结果时,我返回并询问与所有孩子相关的当前数据(而不仅仅是那些具有相关交易的数据,就像我应该拥有的那样),并且即使在此查询(正确) 告诉我没有。

这里没什么好看的,离开。

于 2012-04-19T18:26:02.683 回答