Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Можно ли сделать join только с уникальными значениями EAV? / 9 сообщений из 9, страница 1 из 1
07.05.2020, 11:35
    #39954922
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли сделать join только с уникальными значениями EAV?
В БД есть клиенты, у которых атрибуты указываются моделью EAV.

Например, номера телефонов:
clientattrval1phone799900011112phone799900022223phone79990001111

Есть таблица заявок, в которой фиксируются номера телефонов.
Нужно сопоставить заявку с номером телефона, но только в том случае, если номер телефона уникален (то есть указан только у одного клиента).
В приведенном выше примере телефон 79990001111 неуникален, поскольку задан у клиентов 1 и 3.

Мне на ум приходят только что-то типа такого:
Код: plsql
1.
2.
3.
4.
5.
with UP as (select val from cdata where attr = 'phone' group by val having count(*) = 1)
, UC as (select client, val as phone from UP join cdata using (val) where attr = 'phone')
select *
from reqs
left join UC using (phone)



Но не исключено, что матчить заявки и телефоны нужно будет не по равенству, а с помощью like или regexp, поэтому я бы хотел использовать более "легковесное" решение, чем подзапросы с группировкой.
Не подскажите, в какую сторону смотреть?
Oracle 10g.
Количество клиентов порядка десятка тысяч, у каждого клиента в среднем десяток-два атрибутов.
Количество заявок порядка десятка тысяч.
...
Рейтинг: 0 / 0
07.05.2020, 12:02
    #39954934
кит северных морей
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли сделать join только с уникальными значениями EAV?
Alibek B.
Код: plsql
1.
, UC as (select client, val as phone from UP join cdata using (val) where attr = 'phone')



Код: plsql
1.
2.
3.
4.
5.
6.
7.
with uc as (
  select min(client) client, val 
  from cdata 
  where attr = 'phone' 
  group by val 
  having count(distinct client) = 1
)




Alibek B.
матчить заявки и телефоны нужно будет не по равенству, а с помощью like или regexp

если это делается потому, что в заявках не обязательно соблюдается принятый в EAV формат телефона, то на мой взгляд гораздо проще будет на лету привести номер из заявки в соответствие требуемому формату.
...
Рейтинг: 0 / 0
07.05.2020, 12:02
    #39954935
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли сделать join только с уникальными значениями EAV?
Alibek B.,

зачем
UC as (select client, val as phone from UP join cdata using (val) where attr = 'phone')?

.....
stax
...
Рейтинг: 0 / 0
07.05.2020, 12:22
    #39954941
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли сделать join только с уникальными значениями EAV?
кит северных морей
...select min(client) client, val ... having count(distinct client) = 1

Действительно, не сообразил.
...
Рейтинг: 0 / 0
07.05.2020, 12:38
    #39954948
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли сделать join только с уникальными значениями EAV?
кит северных морей
если это делается потому, что в заявках не обязательно соблюдается принятый в EAV формат телефона

Нет, тут виновата некоторая "костыльность" — в поле "Телефон" помимо собственно номера телефона в некоторых случаях может дописываться определенная метка (3-4 символа).
Сейчас используется такое выражение: regexp_replace(VALUE, '^(79\d{9})(\s+sms)?$', '\1')
Если на рабочих данных производительности будет недостаточно, тогда буду думать дальше.
...
Рейтинг: 0 / 0
07.05.2020, 12:42
    #39954951
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли сделать join только с уникальными значениями EAV?
Alibek B.,

либо нормализуйте в отдельную таблицу, либо хотя бы матвьюху создайте, ну или на худой конец функциональный индекс а-ля decode(attr,'phone',regexp_replace(...)))
...
Рейтинг: 0 / 0
07.05.2020, 12:53
    #39954955
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли сделать join только с уникальными значениями EAV?
В отдельную таблицу нормализовать затруднительно по историческим причинам — пометки используются давно и в разных сценариях. Скорее при необходимости лучше будет не обрабатывать (пропускать) записи с пометками.
Про матвью я думал, но не знаю, как грамотно сделать для него автообновление. REFRESH FAST ON DEMAND WITH ROWID ?
...
Рейтинг: 0 / 0
07.05.2020, 12:55
    #39954957
кит северных морей
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли сделать join только с уникальными значениями EAV?
Alibek B.,

как часто вы собираетесь выполнять сопоставление и какие у процесса требования по производительности?
...
Рейтинг: 0 / 0
07.05.2020, 14:03
    #39954975
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли сделать join только с уникальными значениями EAV?
Сейчас пока речь идет о запуска скрипта вручную, поэтому требований к производительности нет.
Но позже я планирую делать такие сопоставления примерно около сотни раз в час, время ответа должно быть не более секунды (чем меньше, тем лучше).
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Можно ли сделать join только с уникальными значениями EAV? / 9 сообщений из 9, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]