Я понимаю задачу как: соединить таблицы на ID1.Если запрос не дает результата, тогда объедините таблицы в ID2.И т. Д. Если это правильно, то:
Вы можете просто объединить все идентификаторы, а затем оставить только строки, объединенные по «лучшему» идентификатору с предложением TOP
:
select top(1) with ties *
from tablea a
join tableb b on a.extid in (b.id1, b.id2, b.id3, b.id4)
order by
case when a.extid = b.id1 then 1
when a.extid = b.id2 then 2
when a.extid = b.id3 then 3
when a.extid = b.id4 then 4
end;
Если вы скорее имеете в виду строк (то есть, если нет совпадения для ID1 для строки TableA в TableB, затем попробуйте ID2 и т. Д.), То вы будете использовать ту же технику, но использовать оконную функцию с разделением на частивместо идентификатора:
select top(1) with ties *
from tablea a
join tableb b on a.extid in (b.id1, b.id2, b.id3, b.id4)
order by
row_number() over (
partition by a.id
order by
case when a.extid = b.id1 then 1
when a.extid = b.id2 then 2
when a.extid = b.id3 then 3
when a.extid = b.id4 then 4
end);
Пример данных:
TableA
ID | EXTID
-----+------
100 | 1
200 | 2
300 | 3
400 | 4
TableB
ID1 | ID2 | ID3 | ID4
----+-----+-----+----
2 | 3 | |
2 | 4 | |
3 | 4 | |
3 | 2 | 4 | 1
Result for query #1 (all matches on ID1):
ID | EXTID | ID1 | ID2 | ID3 | ID4
----+-------+-----+-----+-----+----
200 | 2 | 2 | 3 | |
200 | 2 | 2 | 4 | |
300 | 3 | 3 | 4 | |
300 | 3 | 3 | 2 | 4 | 1
Result for query #2 (first matching ID):
ID | EXTID | ID1 | ID2 | ID3 | ID4
----+-------+-----+-----+-----+----
100 | 1 | 3 | 2 | 4 | 1
200 | 2 | 2 | 3 | |
200 | 2 | 2 | 4 | |
300 | 3 | 3 | 4 | |
300 | 3 | 3 | 2 | 4 | 1
400 | 4 | 2 | 4 | |
400 | 4 | 3 | 4 | |