2015-07-21 109 views
0

這對於很多人來說可能是一個相當微不足道的問題,但我不習慣寫子查詢和連接,所以我希望有人想要幫助。加入並比較2表中的2個查詢

我有兩個表: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 

但每次我運行它的時候我得到失蹤子句條目。當我單獨運行每個子查詢時,它們都會工作。我對文檔進行了交叉檢查,對我來說看起來還不錯,但顯然我在這裏錯過了一些東西。

回答

1

考慮使用FULL OUTER JOIN

這是不是你所要求的精確的輸出,但你並不需要兩次顯示nummer。

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 
+0

感謝您的回答。我嘗試了你的和我得到的其他答案。但是每次運行它時都會丟失FROM子句條目。當我通過它自己運行每個子查詢時,它們就工作了。我對文檔進行了交叉檢查,對我來說看起來還不錯,但顯然我在這裏錯過了一些東西。
SELECT * (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 – geogrow

+0

它們都在同一個數據庫中嗎?是road_table和old_road_table模式? – mxix

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 
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個或更多表格,我覺得這更容易管理。如果你必須包含另一個表,它將只是所有鍵中的一個聯合,而剩下的一個聯接到該表。