Eu tenho uma situação em que as linhas de entrada (src) precisam corresponder às linhas em uma tabela de destino (tgt). No entanto, cada linha de destino só pode ser correspondida uma vez para todas as linhas de origem de entrada. Exemplo de SQL a seguir:
drop table if exists src;
create table src(id int not null, join_key text not null);
insert into src(id, join_key) values
(1,'X'),
(2,'X'),
(3,'X'),
(4,'Y'),
(5,'Y')
;
drop table if exists tgt;
create table tgt(id int not null, join_key text not null);
insert into tgt(id, join_key) values
(10,'X'),
(20,'X'),
(40,'Y')
;
with a as (
select s.id as src_id,
s.join_key,
t.id as tgt_id
from src s
left join tgt t on s.join_key = t.join_key
),b as (
select *,
row_number() over (partition by src_id order by tgt_id) as rw
from a
)
select src_id, tgt_id from b
where rw = 1
;
Isto dá:
1,10
2,10
3,10
4,40
5,40
Mas os valores devem ser:
1,10
2,20
3,null
4,40
5,null
Como posso fazer isso?