powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Оптимизация join'а большой таблицы с собой же
8 сообщений из 33, страница 2 из 2
Оптимизация join'а большой таблицы с собой же
    #39625695
Andy_OLAP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
K.T.V.К сожалению, данные нормализовать нельзя, только работать над проблемой as is. Нет никакого универсального разделителя телефонов, поэтому нельзя определить, 3 штуки их в поле или 1 . Хорошо что договорились, что ищем только вхождение 1го в 3, а не наоборот :)
K.T.V.есть таблица клиентов и их телефонов. Нужно выбрать тех клиентов, у которых телефоны совпадают
Вам по-моему Гавриленко наглядно пояснил.

Ну таки ладно.

Итак, есть клиент1 и телефон 12345. Вполне себе кошерный телефон. И есть клиент2 и клиент3. У клиента2 есть строка, где телефоны "123" и "45678" сливаются в "12345678". Вы не знаете, как делить, но предполагаете своим кодом, что это может быть "12345" и "678". И выводите клиента 2 как совпадающего. Промашка.

Клиент3 имеет телефон "123456", это совсем другой телефон, не "123-45", а "1-234-56", из другой страны префикс. Вы радостно выводите клиента3 как имеющего телефон "12345". Снова промашка.

Вывод - 380 тысяч вариантов по 128 цифр в строке со СЦЕПЛЕННЫМИ номерами телефонов дадут Вам - как верно заметил из предыдущего сообщения коллега - "144 лярда вариантов" (с)

Вы их честно ВСЕ покажете заказчику. Среди них 17 вариантов честных. Не 17 миллионов, не 17 тысяч, а ровно 17 телефонов у клиентов 1 есть у клиентов 2.

Вывод? Задача не имеет решения, потому что решением является выборка честных вариантов, а Вы выдадите на выход пластмассовую иголку в стогу сена, которую магнитом не найти.
...
Рейтинг: 0 / 0
Оптимизация join'а большой таблицы с собой же
    #39625697
Andy_OLAP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
K.T.V.,

Еще раз. Абстрагируйтесь от задачи, передохните, погуляйте на свежем воздухе и посмотрите на проблему со стороны.

"Нужно выбрать тех клиентов, у которых телефоны совпадают" - ТЕЛЕФОНЫ, а не куски из цифр, которые слеплены в текстовую строку. ТЕЛЕФОНОВ в такой текстовой строке НЕТ. Есть некая мешанина, хаотичная и бессмысленная.

Заниматься построением логического кода, который что-то выведет - это пустая трата времени.
...
Рейтинг: 0 / 0
Оптимизация join'а большой таблицы с собой же
    #39625698
blonduser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гавриленко Сергей АлексеевичK.T.V.Гавриленко Сергей Алексеевич, нет, потому что один телефон клиента полностью должен входить в телефон другого клиентаА где здесь телефоны клиентов? Здесь две строки, к которым не прилагается алгоритм разбития из на подстроки (телефоны), чтобы потом сравнить хотя бы с неразбитой второй строкой.

Это не номера телефонов, а поиск одной строки в другой.

Алгоритм решения был такой...
Все строки сортируются по кол-ву символов.
Для одного кол-ва символов все варианты сортируются по алфавиту.

И дальше идет соответствующий перебор.
Но вроде такая задача решалась средствами С++
...
Рейтинг: 0 / 0
Оптимизация join'а большой таблицы с собой же
    #39625737
K.T.V.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Моя задача с такими условиями имеет быстрое решение. Но т.к. здесь собрались любители увольняться с работы из-за того, что им не предоставили сферические данные в вакууме, очевидно, что постить его смысла не имеет...
...
Рейтинг: 0 / 0
Оптимизация join'а большой таблицы с собой же
    #39625746
blonduser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
K.T.V.Моя задача с такими условиями имеет быстрое решение. Но т.к. здесь собрались любители увольняться с работы из-за того, что им не предоставили сферические данные в вакууме, очевидно, что постить его смысла не имеет...

Очень хочется взглянуть на решение. пжлст.
...
Рейтинг: 0 / 0
Оптимизация join'а большой таблицы с собой же
    #39625750
K.T.V.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
blonduser, непричесанный вариант:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
create table #tempphones (client_id int, clean_phone varchar(128), clean_phone_with_prefix varchar(128))

;with cte as
(select client_id, clean_phone + '%' as clean_phone, clean_phone as clean_phone_with_prefix
from #tempphones
union all
select client_id, clean_phone, right(clean_phone_with_prefix,LEN(clean_phone_with_prefix)-1) as clean_phone_with_prefix
from cte 
where LEN(clean_phone_with_prefix)>5 --считаем, что меньше 5 цифр не телефон
)
select client_id, clean_phone,clean_phone_with_prefix
into #newtable
from cte

create nonclustered index new1
on #newtable (clean_phone_with_prefix asc)

delete from  c1
from #newtable c1
where not exists (select 1 from #newtable c2 
		where c2.Client_Id <> c1.Client_Id 
		and c2.clean_phone_with_prefix like c1.clean_phone
		)



like по полю + '%' дает возможность оптимизатору использовать индекс, за счет чего поиск значительно ускоряется
...
Рейтинг: 0 / 0
Оптимизация join'а большой таблицы с собой же
    #39625751
K.T.V.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
прошу прощения, индекс наверное все же такой:
create nonclustered index new1
on #newtable (clean_phone_with_prefix asc) INCLUDE(client_id)
...
Рейтинг: 0 / 0
Оптимизация join'а большой таблицы с собой же
    #39625804
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
K.T.V.Моя задача с такими условиями имеет быстрое решение. Модератор: Ок, потроллили и ладно.
...
Рейтинг: 0 / 0
8 сообщений из 33, страница 2 из 2
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Оптимизация join'а большой таблицы с собой же
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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