Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 从另一个联接子查询中的联接引用列_Sql_Postgresql - Fatal编程技术网

Sql 从另一个联接子查询中的联接引用列

Sql 从另一个联接子查询中的联接引用列,sql,postgresql,Sql,Postgresql,我正试图用连接、子查询和agregate函数编写一个有点复杂的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

我正试图用连接、子查询和agregate函数编写一个有点复杂的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)
(i简化了列和表的名称)

问题是,第二个联接中的最后一个子查询无法从第一个联接访问table2,所以它会抛出一个错误。如果我从最后一个子查询中删除where子句,查询运行正常,但会得到“table2\u places\u years”中所有行的总和。我只需要与表2中的当前条目相关联的行的总和(通过另外三个表与FKEY链接)

有没有办法让子查询知道第一个join子句中的列

提前谢谢


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

如果数据允许,请使用联接重写查询。然后它会像这样:

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 

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
如果没有,还可以将相关子查询放置在select语句中:

select …,
      (
      select sum(…) …
      ) month_sum
from table1 left join table2 …
最后一种方法可能是横向连接。可能是这样的:

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 

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

如果数据允许,请使用联接重写查询。然后它会像这样:

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 

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
如果没有,还可以将相关子查询放置在select语句中:

select …,
      (
      select sum(…) …
      ) month_sum
from table1 left join table2 …
最后一种方法可能是横向连接。可能是这样的:

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 

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

谢谢!我必须使用postgres 8.4,所以横向连接不是一个选项(但感谢您提供了一个关于学习的好提示:-)),而且实际数据不允许使用第一个选项,所以最好的选择是第二个。我将研究相关的子查询(到目前为止还不知道),并在这里发布一个完整的解决方案。再次感谢!谢谢我必须使用postgres 8.4,所以横向连接不是一个选项(但感谢您提供了一个关于学习的好提示:-)),而且实际数据不允许使用第一个选项,所以最好的选择是第二个。我将研究相关的子查询(到目前为止还不知道),并在这里发布一个完整的解决方案。再次感谢!