Любая помощь будет оценена.
У меня здесь две таблицы с примерами.
Таблица A:
ID |Name
123|REG
123|ERT
124|REG
124|ACR
Таблица B
ID |Name
123|REG
123|WWW
124|REG
124|ADR
Вот простой вывод соединения, и я объясню свой вопрос в комментариях:
* Да - я хочу эту строку
* Нет - я не хочу эту строку
AID|Aname|BID|Bname
123|REG |123|REG --Yes-- Matched-pair for id '123'
123|ERT |123|REG --No--'REG' already had one match. 'ERT' should pair with 'WWW' for id '123'
123|REG |123|WWW --No--The same reason as above
123|ERT |123|WWW --Yes--non-matched pair for id '123'
124|REG |124|REG
124|ACR |124|REG
124|REG |124|ADR
124|ACR |124|ADR
Мой желаемый результат:
AID|Aname|BID|Bname
123|ERT |123|WWW
123|REG |123|REG
124|REG |124|REG
124|ACR |124|ADR
SQL server 2017.
Заранее спасибо.
Мой подход (вдохновленный постом от @The Impaler)
;with CTEall as(
select A.id as AID, A.NAME as Aname, b.id as BID,b.NAME as Bname from A
inner join B on A.id = B.id),
match as (
select A.id as AID, A.NAME as Aname, b.id as BID,b.NAME as Bname
from A inner join B on A.id = B.id and A.NAME = B.NAME)
select *
from CTEall
where Aname not in (select Aname from match where AID = BID)
and Bname not in (select Aname from match where BID = AID)
union all
select * from match
order by 1