繁体   English   中英

连接并比较2个表的2个查询

[英]Join and compare 2 queries of 2 tables

对于这里的许多人来说,这可能是一个相当琐碎的问题,但是我不习惯编写子查询和联接,因此我希望有人希望提供帮助。

我有两个表: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子句条目。 当我分别运行每个子查询时,它们会起作用。 我已经对文档进行了交叉核对,对我来说看起来还可以,但是显然我在这里遗漏了一些东西。

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

以下查询应解决目的。 我没有运行它,但是基本思想是在一个表上查询的结果是另一个可以在其上查询的表。

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

棘手的一点是,您要确保同时包含两个列表中的所有键。 我最喜欢的做这种事情的方法是:

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个或更多表,这将更易于管理。 如果您必须包括另一个表,则它在allkey中只是一个并集,而向该表的左连接又是一个。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM