2012-05-18 31 views
1

背景:加入獨特的SQL行時表具有不等的行數

我用來跟蹤線影像資料的大型數據庫上運行。目前,數據庫(Oracle)圍繞三個主表構成:

1)地圖詳細信息表。定義特定地圖的所有頂級詳細信息,如縣/區/城市。每張地圖由下表中使用的序列號唯一標識。

2)走廊長度表。基本上,烏鴉飛行多久,以及走廊是在公共還是私人土地上。因此,此處定義的素材只是從A到B的距離。

3)線長表。該表存儲有關可以在給定走廊中運行的不同電線的信息。每個工作電壓都有一行。因此,例如,走廊可能有幾段長度的線; 12KV,33KV和66KV。

(1)中總是會有一個地圖記錄,但是在(2)和(3)中存在任意數量的行,並且(2)和(3)中的行數通常不匹配。

問題:

我正在尋找加入這三個表,使得每個鏡頭只報一次的方法。這可以通過示例最好地說明。下面是一個示例記錄集:

Map Details: 
------------------------------------------- 
| SERIAL_NO | CNTY | DIST | MAP_NO (Name) | 
|-----------------------------------------| 
|   1 | 33 | 88 | 123-4567-8 | 
------------------------------------------- 

Corridor Details: 
------------------------------------ 
| SERIAL_NO | PROPRTY_CD | CORR_FT | 
|----------------------------------| 
|   1 |  PUBLIC |  100 | 
|   1 | PRIVATE |  200 | 
------------------------------------ 

Wire Details 
--------------------------------- 
| SERIAL_NO | OPER_KV | WIRE_FT | 
|-------------------------------| 
|   1 |  12 |  300 | 
|   1 |  33 |  200 | 
|   1 |  66 |  200 | 
--------------------------------- 

,我之後的最終輸出將類似以下內容:

-------------------------------------------------------------------------------------- 
| SERIAL_NO | CNTY | DIST | MAP_NO (Name) | PROPRTY_CD | CORR_FT | OPER_KV | WIRE_FT | 
|------------------------------------------------------------------------------------| 
|   1 | 33 | 88 | 123-4567-8 |  PUBLIC |  100 |  12 |  300 | 
|   1 | 33 | 88 | 123-4567-8 | PRIVATE |  200 |  33 |  200 | 
|   1 | 33 | 88 | 123-4567-8 |  NULL | NULL |  66 |  200 | 
-------------------------------------------------------------------------------------- 

注:電線走廊進尺將不匹配最的時間(有導線倍增器,爲了簡潔起見,這裏沒有顯示)。此外,走廊表中可能會有更多的行與走線臺(無走廊的走廊)相反,反之亦然(具有多條走廊的走廊)。

我已經嘗試了許多不同的方法來解決這個問題,但我似乎無法得到我想要的輸出。每一個加入我曾嘗試已導致價值被複制或類似的是哪些如下:

BAD: 
-------------------------------------------------------------------------------------- 
| SERIAL_NO | CNTY | DIST | MAP_NO (Name) | PROPRTY_CD | CORR_FT | OPER_KV | WIRE_FT | 
|------------------------------------------------------------------------------------| 
|   1 | 33 | 88 | 123-4567-8 |  PUBLIC |  100 |  12 |  300 | 
|   1 | 33 | 88 | 123-4567-8 |  PUBLIC |  100 |  33 |  200 | 
|   1 | 33 | 88 | 123-4567-8 |  PUBLIC |  100 |  66 |  200 | 
|   1 | 33 | 88 | 123-4567-8 | PRIVATE |  200 |  12 |  300 | 
|   1 | 33 | 88 | 123-4567-8 | PRIVATE |  200 |  33 |  200 | 
|   1 | 33 | 88 | 123-4567-8 | PRIVATE |  200 |  66 |  200 | 
-------------------------------------------------------------------------------------- 

摘要:

我對長的問題道歉,但它是有點複雜的解釋我是什麼後。長話短說,我想列出兩個子表中的所有行並排(沒有特定的順序),同時爲兩個表之間的行差的列填充NULL。先謝謝你。

+0

您是否在尋找['FULL JOIN'](http://www.w3schools.com/sql/sql_join_full.asp)?這將爲您提供表格的結果,並排顯示不匹配記錄的空白/空值。 – swasheck

+3

電線與哪條走廊相匹配是否重要? – Gabe

+1

感覺像這個數據庫沒有正確規範化。這3張桌子的鑰匙是什麼? –

回答

2

在途中的任務你設置它可能是蠻力強行通過以下方式

--pseudo-tables with sample data 
with t_map as (select 1 serial_no, 33 cnty, 88 dist, '12345678' map_no from dual), 
t_corr as (select 1 serial_no, 'PUBLIC' property_cd, 100 corr_ft from dual union all 
      select 1, 'PRIVATE', 200 from dual), 
t_wire as (select 1 serial_no, 12 oper_kv, 300 wire_ft from dual union all 
      select 1, 33, 200 from dual union all 
      select 1, 66, 200 from dual) 
--query itself 
select m.serial_no, m.cnty, m.dist, m.map_no, r.* 
    from t_map m join 
     (select nvl(c.serial_no, w.serial_no) serial_no, c.property_cd, c.corr_ft, w.oper_kv, w.wire_Ft from (
         (select t_corr.*, row_number() over(partition by serial_no order by serial_no) rn from t_corr) c 
       full join (select t_wire.*, row_number() over(partition by serial_no order by serial_no) rn from t_wire) w 
        on c.serial_no = w.serial_no and (c.rn = w.rn) 
         ) 
     ) r on r.serial_no = m.serial_no; 

但是,如果我是你,我會關注有關在評論中問道,您的初始後的問題;)