powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / ASA9.0.1 Помогите с запросом
6 сообщений из 6, страница 1 из 1
ASA9.0.1 Помогите с запросом
    #32691964
Фотография Vovaka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
То ли туплю что-то, то ли фиг его знает :)
В общем две связные таблицы

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
table1
id
name
type

table2
id 
table1id  reference table1
field1  char
field2

надо получить (одним запросом) выборку field1-field2 из table2 по определенному типу в table1, где значения field1 начинаются с определенной комбинации символов и при этом имеют максимальную длину строки для каждого table1id

т.е. запрос
Код: plaintext
select table1id, field1, field2 from table1 t1, table2 t2 where table1id = t1.id and type =  1  and field1 like '23%'
выводит все записи, а надо еще чтобы length(field1) была максимальной

тут например получаем
1 23 10
1 230 11
1 2345 12
2 23 654
2 23567 54

а надо

1 2345 12
2 23567 54
...
Рейтинг: 0 / 0
ASA9.0.1 Помогите с запросом
    #32692793
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
сделай подзапрос типа:
Код: plaintext
1.
2.
select tableid, field1, field2 from table1 t1, table2 t2 where table1id = t1.id and type =  1  and field1 like '23%'
AND length(field1)=(select max(length(tt.field1)) from table2 tt where t2.tableid=tt.tableid and tt.field1 like '23%')
...
Рейтинг: 0 / 0
ASA9.0.1 Помогите с запросом
    #32692929
Фотография Vovaka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Говорю же - туплю :), бывает ...
Спасибо
...
Рейтинг: 0 / 0
ASA9.0.1 Помогите с запросом
    #32693079
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так план запроса возможно будет получше:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
select table1id, field1, field2 
from table1 t1, table2 t2 
where table1id = t1.id and type =  1  and field1 like '23%' and 
  length(field1) in (
    select max(length(tt.field1)) 
    from table2 tt 
    where t2.table1id=tt.table1id and tt.field1 like '23%' )
Если этот запрос будет использоваться часто, то рекомендую сделать вычисляемый столбец c_LenField1 как compute(Length(Field1)) с типом tinyint для строки длиною до 255 символов или smallint, если поле больше и сделать по нему индекс (table1id, c_LenField1).
...
Рейтинг: 0 / 0
ASA9.0.1 Помогите с запросом
    #32694228
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну с computed field согласен, а почему план запроса будет лучше у in чем у равенства? Я вот сейчас попробовал аналогичный запрос на своей базе. Получил (как и предполагал) что при использовании in общее время обработки больше почти в два раза, чем у знака равенства.
...
Рейтинг: 0 / 0
ASA9.0.1 Помогите с запросом
    #32694452
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlНу с computed field согласен, а почему план запроса будет лучше у in чем у равенства? Я вот сейчас попробовал аналогичный запрос на своей базе. Получил (как и предполагал) что при использовании in общее время обработки больше почти в два раза, чем у знака равенства.
Угу, каюсь - проглазел аггрегацию, в данном случае равенство всегда будет быстрее работать, чем IN, так как ASA преобразует равенство в подзапрос корневого плана запросов, а IN уйдет в Subquery. Фактически следующие запросы для ASA эквиваленты
Код: plaintext
1.
2.
3.
4.
5.
6.
select table1id, field1, field2 
from table1 t1, table2 t2 
where table1id = t1.id and type =  1  and field1 like '23%' and 
  length(field1) = (
    select max(length(tt.field1)) 
    from table2 tt 
    where t2.table1id=tt.table1id and tt.field1 like '23%' )
и
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
select table1id, field1, field2 
from table1 t1
  inner join table2 t2 on table1id = t1.id and type =  1  and field1 like '23%'
  inner join (
    select tt.table1id, max(length(tt.field1)) AS MaxLen
    from table2 tt 
    where tt.field1 like '23%'
    group by tt.table1id
  ) as tt on t2.table1id=tt.table1id and tt.MaxLen = length(t2.field1)
Оба запроса будут иметь идентичный план запросов.
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / ASA9.0.1 Помогите с запросом
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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