Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Informix [игнор отключен] [закрыт для гостей] / как выбрать строки с которых начинаются другие строки? / 6 сообщений из 6, страница 1 из 1
30.08.2005, 16:22
    #33241551
Oleg Luksha
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как выбрать строки с которых начинаются другие строки?
пусть есть таблица с полями Id serial, Phone_Prefix char(20).
как выбрать строки с которых начинаются другие строки?

select r1.fsphone_prefix
from regions_tq r1
where exists( select r2.fsphone_prefix
from regions_tq r2 where r2.fsphone_prefix like r1.fsphone_prefix || '%' and firegion_id<>r1.firegion_id)
order by r1.fsphone_prefix

работает ужасно медленно, хотя есть индексы по обеим полям
и при этом возвращает лишние записи

для 1, 12, 123, 2 вернёт 1, 12, а нужно 1
...
Рейтинг: 0 / 0
30.08.2005, 16:59
    #33241688
Daugava
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как выбрать строки с которых начинаются другие строки?
Oleg Luksha для 1, 12, 123, 2 вернёт 1, 12, а нужно 1
Не совсем понятно, что именно нужно. Если двухсимвольные строки не подходят, то почему бы не добавить условие length(r1.fsphone_prefix)=1
?
...
Рейтинг: 0 / 0
30.08.2005, 17:02
    #33241709
Oleg Luksha
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как выбрать строки с которых начинаются другие строки?
т.к. и 12 начинается с 1, и 123 начинается с 1 то надо вернуть 1, а то что 123 тоже начинается с 12 проигнорировать.
...
Рейтинг: 0 / 0
30.08.2005, 18:17
    #33241974
Valentyn Pidburtnyi
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как выбрать строки с которых начинаются другие строки?
Проще не получилось:

create temp table regions_tq(Id serial, Phone_Prefix varchar(20)) with no log;

insert into regions_tq(Phone_Prefix) values('1');
insert into regions_tq(Phone_Prefix) values('12');
insert into regions_tq(Phone_Prefix) values('123');
insert into regions_tq(Phone_Prefix) values('2');

select r1.phone_prefix
from regions_tq r1
join regions_tq r2 on r2.Id <> r1.Id and r2.phone_prefix like r1.phone_prefix || '%'
left join regions_tq r3 on r3.Id <> r1.Id and r1.phone_prefix like r3.phone_prefix || '%'
where r3.Id is null
group by r1.phone_prefix
order by r1.phone_prefix
...
Рейтинг: 0 / 0
30.08.2005, 20:22
    #33242155
Oleg Luksha
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как выбрать строки с которых начинаются другие строки?
вот реальный запрос с планом. на 2500 записях выполнялся более 5 мин. сплошной перебор:

QUERY:
------
select r1.fsphone_prefix
from regions_tq r1
join regions_tq r2 on r2.firegion_Id <> r1.firegion_Id and r2.fsphone_prefix like r1.fsphone_prefix || '%'
left join regions_tq r3 on r3.firegion_Id <> r1.firegion_Id and r1.fsphone_prefix like r3.fsphone_prefix || '%'
where r3.firegion_Id is null
group by r1.fsphone_prefix
order by r1.fsphone_prefix

Estimated Cost: 48047884
Estimated # of Rows Returned: 729

1) oper.r1: INDEX PATH

(1) Index Keys: fsphone_prefix (Serial, fragments: ALL)

2) oper.r2: SEQUENTIAL SCAN

ON-Filters:(oper.r2.firegion_id != oper.r1.firegion_id AND oper.r2.fsphone_prefix LIKE (oper.r1.fsphone_prefix || '%' ))
NESTED LOOP JOIN

3) oper.r3: SEQUENTIAL SCAN

ON-Filters:(oper.r3.firegion_id != oper.r1.firegion_id AND oper.r1.fsphone_prefix LIKE (oper.r3.fsphone_prefix || '%' ))
NESTED LOOP JOIN(LEFT OUTER JOIN)

PostJoin-Filters:oper.r3.firegion_id IS NULL
...
Рейтинг: 0 / 0
31.08.2005, 10:44
    #33242759
Valentyn Pidburtnyi
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как выбрать строки с которых начинаются другие строки?
Oleg Lukshaвот реальный запрос с планом. на 2500 записях выполнялся более 5 мин. сплошной перебор:


Для ускорения попробуй переписать так: сначала во временную табличку получи рез-т работы прямого join (Там будут '1' и '12'). А потом удали из временной таблицы строки, удовлетворяющие условию для left join regions_tq r3 в запросе.
Избавление от left join - первая задача в оптимизации запроса в большинстве случаев.

ЗЫ
Одним запросом - не вижу как решить оптимальнее, чем я раньше постил...
...
Рейтинг: 0 / 0
Форумы / Informix [игнор отключен] [закрыт для гостей] / как выбрать строки с которых начинаются другие строки? / 6 сообщений из 6, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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