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

我有三个不同的表,我正试图正确地连接起来,但我遇到了一些问题

这是桌子

  • 列车:列车列表(choo Chooo)和列车长度(货车数量)
  • WTA:货车吨A-位置A处列车上货车的重量
  • WTB:货车吨B-位置B处列车上货车的重量
  • 问题是:一些整列火车从瓦格顿表中随机缺失。Wagotonnes表中缺少一些单独的货车。我希望我的查询在缺少的地方将这些案例显示为null

    我第一次尝试这样做,效果很好

    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