または、Oracle固有の手法を使用して、コードを短くすることもできます:http ://www.sqlfiddle.com/#!4/0b796/11
with a as
(
select Num, 'A' as src, Letter
from tblA
union
select Num, 'B' as src, Letter
from tblB
)
select Num, min(Letter) keep(dense_rank first order by src desc) as Letter
from a
group by Num
order by Num;
出力:
| NUM | LETTER |
----------------
| 1 | A |
| 2 | C |
| 3 | D |
| 4 | E |
コードはmin(letter)
またはmax(letter)
に関係なく機能し、同じ出力を持ち、同じ出力を提供します。重要なのはを使用することkeep dense_rank
です。もう1つの重要なことは、順序の問題order by src desc
です。行を保持するときにソーステーブルBを優先するために使用します。
そして、実際に短くするには、を使用し、注文時keep dense_rank last
を省略します。とにかくデフォルトですhttp://www.sqlfiddle.com/#!4/0b796/12desc
asc
with a as
(
select Num, 'A' as src, Letter
from tblA
union
select Num, 'B' as src, Letter
from tblB
)
select Num, min(Letter) keep(dense_rank last order by src) as Letter
from a
group by Num
order by Num;
繰り返しますが、Letterを使用するmin
かmax
、Letterを使用するかは重要ではありません。ただし、keepdensity_rankが優先/優先行を取得する限りです。