编辑:没关系,想通了,如果您有兴趣,请在下面回答。
使用 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
...基本上,我需要field
from child_table
whencriteria
匹配我在 中提供的数据,并且在请求期间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 后面,没有任何变化