2011-03-31 24 views
1

我有三個不同的表,我試圖正確地加入,但我遇到了一些問題。Oracle SQL:正確加入此查詢的方法?

下面是表

  1. 火車:在貨車的數量列車的列表(周仰傑 - choooo)和列車長度
  2. WTA:旅行車噸 - 在地點在鐵路貨車的重量
  3. WTB:旅行車噸乙 - 在位置B處

問題在鐵路貨車的重量:一些火車全是隨機從任一/或丟失/兩個WagonTonnes表。 WagonTonnes表中缺少一些單獨的貨車。我希望我的查詢將這些情況顯示爲空缺少的地方。

我第一次嘗試這樣做,它工作正常。

select 
train.id, 
train.length, 
a.position_in_train 
a.tonnes, 
from 
train 
left outer join wta a 
using (train_id) 

現在我想添加一個左外連接B,像這樣

select 
train.id, 
train.length, 
a.position_in_train 
a.tonnes, 
b.position_in_train, 
b.tonnes 
from 
train 
left outer join wta a 
using (train_id) 
left outer join wtb b 
using (train_id) 

但這進入瘋狂,並一遍又一遍地重複同一行的結果。

建議的解決方案

我懷疑我不知需要得到來自列車的查詢,而不是看起來像這樣,

train.id train.length 
7  163 

看起來是這樣的,而不是

train.id train.position 
7  1 
7  2 
7  3 
7  4 
...  ... 
7  162 
7  163 

而且然後重寫我的連接看起來像這樣:

left outer join wta a 
on (a.train_id = train.train_id and a.position = train.position) 

問題1:我對這個問題的一般方法是否正確? (聯合)

問題2:我的解決方案是否正確?如果是這樣,我該如何執行它?

回答

3

您的方法可行,但我認爲將LEFT JOIN加入代表WTA和WTB超集的組合數據集會更容易。兩部分的UNION ALL模擬MySQL中缺少的FULL JOIN。

select 
t.id, 
t.length, 
wt.a_position_in_train, 
wt.a_tonnes, 
wt.b_position_in_train, 
wt.b_tonnes 
from train t 
left join (
    select a.train_id, 
     a.position_in_train a_position_in_train, a.tonnes b_tonnes, 
     b.position_in_train b_position_in_train, b.tonnes b_tonnes 
    from wta a left join wtb b on a.train_id = b.train_id and a.position_in_train = b.position_in_train 
    union all 
    select b.train_id, a.position_in_train, a.tonnes, b.position_in_train, b.tonnes 
    from wta b left join wtb a on a.train_id = b.train_id and a.position_in_train = b.position_in_train 
    where a.train_id is null 
) wt on t.train_id = wt.train_id 
order by t.train_id, coalesce(a_position_in_train, b_position_in_train) 

腦凍,甲骨文,全面的連接就可以(內查詢)

select coalesce(a.train_id, b.train_id) train_id, 
     a.position_in_train a_position_in_train, a.tonnes b_tonnes, 
     b.position_in_train b_position_in_train, b.tonnes b_tonnes 
    from wta a full join wtb b 
     on a.train_id = b.train_id and a.position_in_train = b.position_in_train 
+0

這是真棒:)我與甲骨文合作,所以我應該能夠使用完整的加盟。你能建議如何改變你寫的SQL嗎? – 2011-03-31 02:53:11

+0

@Tommy/answer使用完全加入更新 – RichardTheKiwi 2011-03-31 05:46:46