Вы не очень хорошо объяснили свою проблему, поэтому давайте создадим пример:
- Есть таблица клиентов и таблица заказов. Оба не связаны через ключи, потому что оба импортированы из разных систем. Теперь ваша задача - найти клиента по заказу.
- Обе таблицы содержат фамилию, имя, город и номер клиента. Однако эти столбцы являются необязательными в таблице заказа (но всегда указываются либо фамилия, либо номер клиента). И иногда имя или город могут быть сокращены или написаны с ошибками (например, J./James, NY / New York, Cris / Chris).
Итак, если заказ содержит номер клиента, мы имеем матч и готово. В противном случае фамилия должна совпадать. В последнем случае мы смотрим на имя и город тоже. У обоих совпадают? Единственный? Не так ли?
Мы используем RANK
, чтобы ранжировать клиентов по заказу и выбирать лучшие совпадения. Некоторые заказы будут заканчиваться ровно одним совпадением, другие будут иметь связи, и мы должны затем проверить данные вручную (наихудший случай - отсутствие номера клиента и совпадения фамилии из-за имени с ошибкой).
select *
from
(
select
o.*,
c.*,
rank() over
(
partition by o.order_number
order by
case
when c.client_number = o.client_number then 1
when c.last_name = o.last_name and c.first_name = o.first_name and c.city = o.city then 2
when c.last_name = o.last_name and (c.first_name = o.first_name or c.city = o.city) then 3
when c.last_name = o.last_name then 4
else 5
end
) as rnk
from orders o
left join clients c on c.client_number = o.client_number or c.last_name = o.last_name
) ranked
where rnk = 1
order by order_number;
Я надеюсь, что это даст вам представление о том, как написать такой запрос, и вы сможете адаптировать эту концепцию к вашему делу.