【问题标题】:Referencing colum from JOIN in another JOINS subquery在另一个 JOINS 子查询中引用来自 JOIN 的列
【发布时间】:2013-11-21 09:26:43
【问题描述】:

我正在尝试使用连接、子查询和聚合函数编写一个有点复杂的 POSTGRES 查询。一切正常,但有一件事。代码如下:

SELECT 

table1.id AS id1,
table1.name AS name,
table1.table2_fkey AS id2
table2.name AS name2,
table2.id,
month_sum

FROM table1 
LEFT JOIN table2 ON (table1.table2_fkey = table2.id) 
INNER JOIN (
    SELECT sum(months) AS month_sum FROM (
        SELECT (month_1 + month_2 + month_3 + month_4 + month_5 + month_6 + month_7 + month_8 + month_9 + month_10 + month_11 + month_12) as months FROM table2_places_years WHERE table2_places_fkey IN (
            SELECT id FROM table2_places WHERE table2_people_fkey IN (
                SELECT id FROM table2_people WHERE table2_fkey = table2.id
            )
        ) 
    ) AS months
) AS month_sum ON (table2.id = id2)

(我简化了列名和表名)

问题是第二个 JOIN 中的最后一个子查询无法从第一个连接访问 table2,因此会引发错误。如果我从最后一个子查询中删除 where 子句,查询运行良好,但会得到“table2_places_years”中所有行的总和。我只想要与 table2 中的当前条目关联的行的总和(通过另外三个表与 fkeys 链接)。

有没有办法“让子查询知道”第一个连接子句中的列?

提前致谢!

注意:这段代码可能无法正常工作,因为我做了一些简化。

【问题讨论】:

    标签: sql postgresql


    【解决方案1】:

    如果数据允许,使用连接重写查询。然后它看起来像这样:

    join (
    select table2_fkey, sum(…) …
    from table2_places_years
    join table2_places …
    join table2_people …
    group by table2_fkey
    ) month_sum on table2_fkey = table2.id
    

    如果没有,也可以将相关子查询放在select语句中:

    select …,
          (
          select sum(…) …
          ) month_sum
    from table1 left join table2 …
    

    最后一种方法可能是横向连接。它可能看起来像这样:

    SELECT 
    
    table1.id AS id1,
    table1.name AS name,
    table1.table2_fkey AS id2
    table2.name AS name2,
    table2.id,
    month_sum
    
    FROM table1 
    LEFT JOIN table2 ON (table1.table2_fkey = table2.id),
    LATERAL (
        SELECT sum(months) AS month_sum FROM (
            SELECT (month_1 + month_2 + month_3 + month_4 + month_5 + month_6 + month_7 + month_8 + month_9 + month_10 + month_11 + month_12) as months FROM table2_places_years WHERE table2_places_fkey IN (
                SELECT id FROM table2_places WHERE table2_people_fkey IN (
                    SELECT id FROM table2_people WHERE table2_fkey = table2.id
                )
            ) 
        ) AS months
    ) month_sum
    

    http://www.depesz.com/2012/08/19/waiting-for-9-3-implement-sql-standard-lateral-subqueries/

    【讨论】:

    • 谢谢!我必须使用 postgres 8.4,所以横向连接不是一个选项(但感谢学习的好技巧:-)),实际数据不允许第一个选项,所以最好的选择是第二个。我将研究相关的子查询(直到现在才知道它们),并在我让它工作时在这里发布一个完整的解决方案。再次感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-14
    • 1970-01-01
    • 1970-01-01
    • 2020-02-28
    • 2017-04-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多