または、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/12descasc
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が優先/優先行を取得する限りです。