这对许多人来说可能是一个非常微不足道的问题,但我不习惯编写子查询和联接,所以我希望有人想帮忙。
我有两张桌子:new_road和old_roads。
这两个查询总结了属于特定道路编号的道路长度。
SELECT new_road.nummer, SUM(new_road.length) FROM road_table.road GROUP BY new_road.nummer
SELECT old_road.nummer, SUM(ST_length(old_road.geom)) FROM old_road_table.old_road GROUP BY old_road.nummer
我希望有一个结果表来连接这两个查询,这样我就可以比较每个道路编号的新旧总长度。
像
old.nummer old.length new.nummer new.lenght
2345 10.3 2345 10.5
2346 578.2 2346 600
2347 54.2 NULL NULL
NULL NULL 2546 32.2
我认为需要某种版本的外部联接,因为old_road表中的路数在new.road表中不存在,我也希望看到它们。
欣赏任何建议
编辑:
根据以下建议,我想出了这个:
SELECT * FROM
(SELECT new_road.nummer, SUM(new_road.length) FROM road_table.road GROUP BY new_road.nummer) new_table
FULL OUTER JOIN
(SELECT old_road.nummer, SUM(ST_length(old_road.geom)) FROM old_road_table.old_road GROUP BY old_road.nummer) old_table
ON new_road.nummer = old_road.nummer
但每次我运行它都会丢失FROM子句条目。当我单独运行每个子查询时,它们可以工作。我已经对文档进行了交叉检查,看起来对我很好,但显然我在这里遗漏了一些东西。
答案 0 :(得分:1)
考虑使用FULL OUTER JOIN
这不是您要求的确切输出,但您不需要两次显示数字。
SELECT
COALESCE(new_road.nummer,old_road.nummer)nummer,
new_road.length,
old_road.length
FROM (
SELECT new_road.nummer
,SUM(new_road.length) length
FROM road_table.road
GROUP BY new_road.nummer
) new_road
FULL OUTER JOIN (
SELECT old_road.nummer
,SUM(ST_length(old_road.geom))length
FROM old_road_table.old_road
GROUP BY old_road.nummer
) old_road ON
old_road.nummer = new_road.nummer
答案 1 :(得分:0)
以下查询应解决目的。我没有运行它,但基本的想法是对表的查询结果是另一个表,您可以再次查询。
Select * FROM (SELECT new_road.nummer, SUM(new_road.length) FROM road_table.road GROUP BY new_road.nummer) table1 JOIN (SELECT old_road.nummer, SUM(ST_length(old_road.geom)) FROM old_road_table.old_road GROUP BY old_road.nummer) table2 ON table1.new_road.nummer = table2.old_road.nummer
答案 2 :(得分:0)
这里棘手的一点是你要确保包含两个列表中的所有键。我最喜欢做这种事情的方法是:
select * from (
SELECT distinct new_road.nummer as nummer from road_table.road
union
SELECT distinct old_road.nummer as nummer FROM old_road_table.old_road
) allkeys
left join
(
SELECT new_road.nummer as nummer, SUM(new_road.length) as nlen
FROM road_table.road GROUP BY new_road.nummer
) n
on allkeys.nummer = n.nummer
left join
(
SELECT old_road.nummer as nummer, SUM(ST_length(old_road.geom)) as olen
FROM old_road_table.old_road GROUP BY old_road.nummer
) o
on allkeys.nummer = o.nummer
第一个子查询构建所有键的列表,然后从那里加入两个查询。外部联接没有任何问题,但如果您必须包含3个或更多表,我发现这更容易管理。如果你必须包含另一个表,那么它将只是allkeys中的一个联合,还有一个联接到该表。