编辑:没关系,想通了,如果您有兴趣,请在下面回答。
使用 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
。基本上,当criteria
与我在parent_table
中提供的数据匹配时,以及在请求的时间段内至少有一个相关交易child_transaction
时,我需要来自child_table
field
。 如果child_current_status
视图中有数量,我们也想要这些数量。
t1.field
可以被认为是人类可读的等价物,等同于数字键t4.criteria
。
我的问题是,即使那里有数据,提供的查询也无法提供来自child_current_status
的数量数据。
编辑:澄清一下,上面的查询返回field, NULL
,它应该返回field, current_qty
该问题与t2
子查询有关,因为当我将其更改为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 转换为左连接,该查询返回的相关数量child_current_status
. 如果我将child_current_status
更改为内部连接,则查询不会返回任何内容。 使第一个 JOIN 成为左连接的问题在于,我需要它仅在从子查询返回数据时才返回结果,在本例中是请求的时间段。
为了搅浑水,它在某些t4.criteria
中正常工作,763只是它失败的一个。
我在这里错过了什么?
简短版本:从上面的第一个查询来看,当第一个 JOIN 是内部连接时,它会导致 LEFT JOIN 不返回任何内容。 当它是 LEFT JOIN 时,child_current_status
上的 LEFT JOIN 会返回正确的数据,但这否定了第一个 JOIN 的目的。
编辑:我尝试将左连接移动到 FROM 子句的末尾,在内部连接后面,没有更改
没关系,我想通了,查询工作正常,这里没有足够的数据供这里的其他人弄清楚。 基本上,child_table
中有一个子项的一笔交易,child_table
中还有其他子项的当前数量。 因此,查询适当地指示在指定时间内为指定父级进行事务的任何子项的当前数量。
问题出现了,因为在处理此查询的结果时,我回过头来询问与所有孩子相关的当前数据(而不仅仅是那些具有相关交易的数据,就像我应该有的那样),即使这个查询(正确)告诉我没有,我也得到了信息。
这里没什么可看的,继续前进。