簡體   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