JOIN单独处理两个表,但不能一起使用

时间:2012-04-19 15:38:28

标签: sql postgresql join postgresql-8.4

编辑:没关系,想出来,如果你有兴趣,请回答如下。

使用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

...基本上,当fieldchild_table中提供的数据匹配时,我需要criteria中的parent_table,并且child_transaction中至少有一个相关交易{1}}在请求的期间内。如果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转换为LEFT JOIN,该查询返回child_current_status中的相关数量。如果我将child_current_status更改为INNER JOIN,则查询不返回任何内容。使第一个JOIN成为LEFT JOIN的问题是,我需要它只在子查询返回数据时返回结果,在这种情况下,在所请求的时间段内存在。

为了使水域变得混乱,它适用于某些 t4.criteria,而763只是它失败的原因。

我在这里缺少什么?


简短版本:从上面的第一个查询开始,当第一个JOIN是INNER JOIN时,它会导致LEFT JOIN不返回任何内容。当它是LEFT JOIN时,child_current_status上的LEFT JOIN返回正确的数据,但这会否定第一个JOIN的目的。

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

1 个答案:

答案 0 :(得分:0)

呃,没关系,我弄清楚了,查询工作正常,这里没有足够的数据供其他人知道。基本上,child_table中有一个孩子有一个交易,child_table中有其他孩子的当前数量。因此,查询适当地表明在指定父级的指定时间内没有任何子事件的当前数量。

问题出现了,因为在处理此查询的结果时,我回去询问与所有孩子有关的当前数据(而不仅仅是那些有相关交易的人,比如我应该有的) ,即使这个查询(正确地)告诉我没有信息,也得到了信息。

这里没什么可看的,继续前进。