UNION ALL表现不理想-Oracle SQL

时间:2019-10-09 16:33:55

标签: sql oracle union union-all

我有两个表:

表A

| Part | Val |
|:----:|:---:|
|  AA  |  3  |
|  AB  |  2  |
|  AC  |  11 |
|  AD  |  6  |
|  AE  |  3  |

表B

| Part | Val |
|:----:|:---:|
|  AC  |  9  |
|  AF  |  5  |
|  AG  |  1  |
|  AH  |  10 |
|  AI  |  97 |

我想union这些表来实现此结果:

| Part | ValA | ValB |
|:----:|:----:|:----:|
|  AA  |   3  |   0  |
|  AB  |   2  |   0  |
|  AC  |  11  |   9  |
|  AD  |   6  |   0  |
|  AE  |   3  |   0  |
|  AF  |   0  |   5  |
|  AG  |   0  |   1  |
|  AH  |   0  |  10  |
|  AI  |   0  |  97  |

我尝试过:

SELECT * FROM tableA
UNION ALL
SELECT * FROM tableB

但这只会导致一列val,我不希望这样做。

如何合并这些表并创建两列,每列一个,如果零件未出现在另一张表中,则该列的值只能为0?

SQL FIDDLE供参考。

2 个答案:

答案 0 :(得分:5)

您似乎想加入表格,而不是合并表格

select nvl(a.Part, b.Part) as Part, 
       nvl( a.Val, 0 )     as ValA, 
       nvl( b.Val, 0 )     as ValB
  from tableA a
       full outer join tableB b 
         on( a.Part = b.Part )
 order by 1

请注意,像在小提琴中一样使用区分大小写的标识符通常是不受欢迎的。这样做会使编写查询变得比原本复杂得多,而且不得不在每个列名的两边加上双引号也很烦人。

Demo

答案 1 :(得分:0)

您可以在下面尝试-

   select part,max(valA),max(valB) from
   (
      select part, val as valA, 0 as valB from tableA
      union all
      select part, 0 , val  from tableB
   )A group by part