Oracle SQL:加入此查询的正确方法?
我有三个不同的表,我正试图正确地连接起来,但我遇到了一些问题 这是桌子Oracle SQL:加入此查询的正确方法?,sql,oracle,join,left-join,inner-join,Sql,Oracle,Join,Left Join,Inner Join,我有三个不同的表,我正试图正确地连接起来,但我遇到了一些问题 这是桌子 列车:列车列表(choo Chooo)和列车长度(货车数量) WTA:货车吨A-位置A处列车上货车的重量 WTB:货车吨B-位置B处列车上货车的重量 问题是:一些整列火车从瓦格顿表中随机缺失。Wagotonnes表中缺少一些单独的货车。我希望我的查询在缺少的地方将这些案例显示为null 我第一次尝试这样做,效果很好 select train.id, train.length, a.position_in_train
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:我的解决方案正确吗?如果是这样,我如何实现它?您的方法会奏效,但我认为更容易左键连接到表示WTA和WTB超集的组合数据集。由两部分组成的联合都模拟MySQL中缺少的完全连接
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)
大脑冻结,对于Oracle来说,完全连接将是(内部查询)
这太棒了:)我正在与oracle合作,所以我应该能够使用完全连接。您能建议如何更改您编写的SQL吗?
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