Berikut ini adalah dua tabel. Saya ingin pertama-tama bergabung dengan mereka dengan nilai yang sama persis dan kemudian tidak cocok.

enter image description here

Saya membutuhkan output seperti di bawah ini.

enter image description here

drop table if exists #C
CREATE TABLE #C(CustNo varchar(100), TranID varchar (100))
insert into #C values

('A','A123'),
('A','A456'),
('A','A586'),
('B','B36')

drop table if exists #D
CREATE TABLE #D(VCustNo varchar(100), VTransID varchar (100))
INSERT INTO #D VALUES
('A','A123'),
('A','A456'),
('A','A555'), 
('A','A858'), 
('C','C469')
0
user1041627 11 April 2020, 16:28

1 menjawab

Jawaban Terbaik

Ini agak rumit. Anda ingin pertandingan berdampingan. Maka Anda ingin ketidakcocokan dipesan secara independen. Saya merekomendasikan union all untuk dua kasus berbeda:

select a.custno as custno, a.transId, b.vtransId
from a join
     b
     on a.custno = b.vcustno and a.transId = b.vtransId
union all
select custno, max(TransId), max(vTransId)
from (select coalesce(a.CustNo, b.vCustNo) as custno, a.TransId, b.VTransId, 
             row_number() over (partition by coalesce(a.custno, b.vcustno),
                                             case when a.TransId is null then 1 else 2 end, 
                                             case when b.vTransId is null then 1 else 2 end
                                order by TransId) as seqnum
      from a full join
           b
           on a.custno = b.vcustno and a.transId = b.vtransId
      where a.custno is null or b.vcustno is null
     ) ab
group by custno, seqnum
order by custno;

Ini adalah biola db<>.

Anda juga dapat mengucapkan ini tanpa union all, tetapi menurut saya hal di atas lebih mudah diikuti:

select custno, max(TransId), max(vTransId)
from (select coalesce(a.CustNo, b.vCustNo) as custno, a.TransId, b.VTransId, 
             row_number() over (partition by coalesce(a.custno, b.vcustno)
                                order by case when a.TransId is not null and b.vTransId is null then 1
                                              when b.vTransId is null then 2 else 3
                                         end) as seqnum
      from a full join
           b
           on a.custno = b.vcustno and a.transId = b.vtransId
     ) ab
group by custno, seqnum
order by custno;
1
Gordon Linoff 11 April 2020, 13:43