加入并比较2个表

时间:2015-07-21 14:18:16

标签: sql postgresql

这对许多人来说可能是一个非常微不足道的问题,但我不习惯编写子查询和联接,所以我希望有人想帮忙。

我有两张桌子: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子句条目。当我单独运行每个子查询时,它们可以工作。我已经对文档进行了交叉检查,看起来对我很好,但显然我在这里遗漏了一些东西。

3 个答案:

答案 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中的一个联合,还有一个联接到该表。