Sql 从另一个联接子查询中的联接引用列
我正试图用连接、子查询和agregate函数编写一个有点复杂的POSTGRES查询。除了一件事,一切都很好。代码如下: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
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,所以横向连接不是一个选项(但感谢您提供了一个关于学习的好提示:-)),而且实际数据不允许使用第一个选项,所以最好的选择是第二个。我将研究相关的子查询(到目前为止还不知道),并在这里发布一个完整的解决方案。再次感谢!