Full join multiple tables on same columns

后端 未结 1 1295
暗喜
暗喜 2021-01-31 09:18

I have four tables:

╔═══╦════╗ ╔═══╦════╗ ╔═══╦════╗ ╔═══╦════╗
║ K ║ V1 ║ ║ K ║ V2 ║ ║ K ║ V3 ║ ║ K ║ V4 ║
╠═══╬════╣ ╠═══╬════╣ ╠═══╬════╣ ╠═══╬════╣
║ A ║  1          


        
相关标签:
1条回答
  • 2021-01-31 09:49

    There are several ways, but I think the following is the most popular:

    select allk.k, t1.c1, t2.v2, t3.v3, t4.v4
    from (select k from t1 union 
          select k from t2 union
          select k from t3 union
          select k from t4
         ) allk left outer join
         t1
         on allk.k = t1.k left outer join
         t2
         on allk.k = t2.k left outer join
         t3
         on allk.k = t3.k left outer join
         t4
         on allk.k = t4.k;
    

    If you have a separate table of all the k values, you can use that instead of the allk subquery.

    An easier way to write your full outer join query is to use coalesce():

    SELECT COALESCE(t1.K, t2.K, t3.K, t4.K) [K], V1, V2, V3, V4
    FROM @T1 t1 FULL JOIN
         @T2 t2
         ON t2.K = t1.K FULL JOIN
         @T3 t3
         ON t3.K = coalesce(t1.K, t2.K) FULL JOIN
         @T4 t4
         ON t4.K = coalesce(t1.K, t2.K, t3.k);
    

    And the third method is the union all/group by method:

    select k, max(v1) as v1, max(v2) as v2, max(v3) as v3, max(v4) as v4
    from (select k, v1, NULL as v2, NULL as v3, NULL as v4
          from t1 union all
          select k, NULL as v1, v2, NULL as v3, NULL as v4
          from t2 union all
          select k, NULL as v1, NULL as v2, v3, NULL as v4
          from t3 union all
          select k, NULL as v1, NULL as v2, NULL as v3, v4
          from t4
         ) t
    group by k;
    
    0 讨论(0)
提交回复
热议问题