powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Помогите с запросом
25 сообщений из 33, страница 1 из 2
Помогите с запросом
    #33681780
Alexey713
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
База ASA8
Не могу сообразить как лучше сделать такую штуку:

Есть таблица в которой к каждому товару хранятся значения различных свойств:
столбцы good_id, property_id, propertyvalue. и например есть какие то значения-

good_id | property_id| propertyvalue
a13 | 0006 | red
a13 | 0007 | 10x10
a14 | 0006 | white
.............
Как мне отобрать товар, который удовлетворяет сразу двум свойствам?
например мне нужно выбрать товар у которого св-во 0006 будет равняться red а свойство 0007 будеть равняться 10х10?
...
Рейтинг: 0 / 0
Помогите с запросом
    #33681831
Фотография Рыжий Кот
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
SELECT distinct good_id FROM table1 t1
where exists(select * from table1 t2 where t1.good_id = t2.good_id and property_id = '0006' and trim(propertyvalue) = 'red')

and

exists(select * from table1 t2 where t1.good_id = t2.good_id and property_id = '0007' and trim(propertyvalue) = '10x10')
...
Рейтинг: 0 / 0
Помогите с запросом
    #33681871
Владимор Конев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey713База ASA8
Не могу сообразить как лучше сделать такую штуку:

Есть таблица в которой к каждому товару хранятся значения различных свойств:
столбцы good_id, property_id, propertyvalue. и например есть какие то значения-

good_id | property_id| propertyvalue
a13 | 0006 | red
a13 | 0007 | 10x10
a14 | 0006 | white
.............
Как мне отобрать товар, который удовлетворяет сразу двум свойствам?
например мне нужно выбрать товар у которого св-во 0006 будет равняться red а свойство 0007 будеть равняться 10х10?
ПУсть есть таблица T вида:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
select * 
  from t

Query finished, retrieving results...

GOOD_ID  PROPERTY_ID  PROPERTYVALUE
-------  -----------  -------------
a13       0006          red
a13       0007          10x10
a14       0006          white

 3  row(s) retrieved
Вот тебе запрос, который вернёт нужные записи:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
select * 
  from t
 where case
          when property_id = '0006' and propertyvalue = 'red'
               or
               property_id = '0007' and propertyvalue = '10x10'
          then  1 
          else  0 
       end =  1 

Query finished, retrieving results...

GOOD_ID  PROPERTY_ID  PROPERTYVALUE
-------  -----------  -------------
a13         0006         red
a13         0007         10x10

 2  row(s) retrieved
...
Рейтинг: 0 / 0
Помогите с запросом
    #33681885
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как раз из разряда, почему в РСУБД плохо хранить свойства-значения в записях:
Код: plaintext
1.
2.
3.
4.
5.
6.
SELECT g.Good_id
FROM Goods g
  KEY JOIN Goods_Properties gp1
  KEY JOIN Goods_Properties gp2
WHERE 
  gp1.Property_id = '0006' AND gp1.PropertyValue = 'red' AND
  gp2.Property_id = '0007' AND gp2.PropertyValue = '10x10';
где Goods - таблица товаров, Goods_Properties - таблица свойств товаров, они связаны FK по полю Goods_id. Думаю не стоит говорить, сколько будет длиться поиск, если будет много товаров и свойств - на каждое условие поиска будет идти дополнительное сканирование таблицы Goods_Properties.

В тоже время:
Код: plaintext
1.
2.
3.
SELECT g.Good_id
FROM Goods g
  KEY JOIN Goods_TypeProduct_1 tp
WHERE tp.Color = 'red' AND tp.Size = '10x10'
отработает моментально, где Goods - это таблица товаров с общими аттрибутами с полем "Тип продукции", где для каждого типа продукции существует собственная таблица Goods_TypeProduct_* с полями, уникальными для продукции выбранного типа. Для такой схемы можно поиск организовать в виде ХП, которая будет в зависимости от типа продукции собирать запрос с нужными таблицами, выполнять и возвращать его через динамический SQL. Дальше ее уже можно будет так же использовать в запросах.

P.S. Случае не интернет-магазин пишите ?
...
Рейтинг: 0 / 0
Помогите с запросом
    #33681908
Alexey713
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо всем!!
Нет не интернет магазин, но похоже... БД не моя -я к ней только цепляюсь поэтому саму БД менять не могу, а такая структура видимо из-за того, что в каталоге товаров слишком много разношерстного товара, плюс к тому база унифицирована..
...
Рейтинг: 0 / 0
Помогите с запросом
    #33682765
antand
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вы наверно базу системы БизнесПро щупаете?
...
Рейтинг: 0 / 0
Помогите с запросом
    #33683176
Alexey713
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну да, ее конечно...
...
Рейтинг: 0 / 0
Помогите с запросом
    #33683356
antand
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Просто очень знакомая структура сразу в глаза бросилась.
А я ее эксплуатирую по полной.
...
Рейтинг: 0 / 0
Помогите с запросом
    #33683982
iLLer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Э-э-э-э, вы щас научите мол чела!
Вот так:
SELECT g.Good_id
FROM Goods g
KEY JOIN Goods_Properties gp1
KEY JOIN Goods_Properties gp2
WHERE
gp1.Property_id = '0006' AND gp1.PropertyValue = 'red' AND
gp2.Property_id = '0007' AND gp2.PropertyValue = '10x10';Будет тормозить.А
вот так:SELECT gp1.goods_id as g
FROM Goods_Properties gp1,Goods_Properties gp2WHERE
gp1.Property_id = '0006' AND gp1.PropertyValue = 'red' AND
gp1.good_id=gp2.good_id AND
gp2.Property_id = '0007' AND gp2.PropertyValue = '10x10'group by g;Не
будет. Поверьте мне при такой структуре самый производительный
вариант.Почему так утверждаю? Потому что у самого реализована на АСА система
полнотекстового поиска.И там использована аналогичная структура хранения
данных, ведь в каждом тексте имеется заранее неопределенное кол-во
слов(словоформ), как и здесь разное кол-во атрибутов у товаров. Перепробовал
множество вариантов, в том числе и с использованием INTERSECTа, EXISTа,
DISTINCTа, вложенных запросов.И только в приведенном выше варианте будет
нормально работать оптимизатор, и будут использованы индексы
(подразумевается что goods_id и property_id есть ПК).В моем случае все
усугублялось еще и тем, что использовался динамический SQL, и кол-во
экзепляров таблицы свойств товара было переменным(gp1, gp2, ... gpN). И даже
с динамическим SQL все нормально функциклирует.


Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Помогите с запросом
    #33684024
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iLLer:
А Вы кстати в курсе, что Ваш вариант = Мой вариант + Зачем то Group by ?
То есть если group by убрать, то у нас будут одинаковые планы запроса, если не убрать, то Ваш запрос будет просто медленнее работать.
...
Рейтинг: 0 / 0
Помогите с запросом
    #33684135
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Заявления iLLer про производительность его варианта , думаю, надуманы.

Самый правильный и производительный вариант запроса -- это SELECT одной записи с двумя EXISTS в WHERE. Производительный - потому что он реально отражает суть требуемого запроса и не делает ничего лишнего.
При наличии в таблице свойств не более одной записи для каждого товара производительность его будет никак не хуже запроса с двумя JOIN-ами.
...
Рейтинг: 0 / 0
Помогите с запросом
    #33684333
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv: в ASA 9 запрос с 2 EXISTS в WHERE будет равнозначен моему запросу с 2-мя JOIN-ами.

P.S. Я вообще не понимаю, почему все гадают на кофейной гуще, делая однозначные утверждения насчет того, какой запрос будет производительней. Для каждой СУБД, каждой версии (и даже подверсии) будут свои правила. Я лично единственное, что могу утверждать для ASA 9.0.2 и выше (в т.ч. SA10) - различные варианты записи одних и тех же запросов на уровне оптимизатора будут иметь одинаковый план запроса - на моей памяти это утверждение верно всегда, кроме случая использования подзапроса в SELECT (т.е. SELECT (SELECT ...) FROM ...), который будет всегда выводится оптимизатором в плане запросов как Subquery по отношению к главному запросу. Так что я к примеру уже давно с таким оптимизатором бросил привычку изголятся куда поставить соединения - в JOIN, IN, EXISTS, DT, LATERAL - толку то, если оптимизатор все равно переделывает в запросе соединения и условия по наиболее оптимальному варианту - нам остается только выбирать форму записи руководствуясь читабельностью запроса и более краткой формой записи.
...
Рейтинг: 0 / 0
Помогите с запросом
    #33684378
Фотография Александр Гoлдун
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ASCRUS пишет:

> Так что я к примеру уже давно с таким
> оптимизатором бросил привычку изголятся куда поставить соединения - в
> JOIN, IN, EXISTS, DT, LATERAL - толку то, если оптимизатор все равно
> переделывает в запросе соединения и условия по наиболее оптимальному
> варианту - нам остается только выбирать форму записи руководствуясь
> читабельностью запроса и более краткой формой записи.

Аналогично.

Добавлю только, что иногда перед тем, как спорить на тему сравнения
запросов для ASA, стоит вспомнить про функцию

REWRITE


--
www.rusug.ru
Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Помогите с запросом
    #33684674
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ASCRUSMasterZiv: в ASA 9 запрос с 2 EXISTS в WHERE будет равнозначен моему запросу с 2-мя JOIN-ами.


Вообще я пожалуй протопмозил , если там не более одной записи на property будет, то и с JOIN-ами нормально.

ASCRUS
Я вообще не понимаю, почему все гадают на кофейной гуще, делая однозначные утверждения насчет того, какой запрос будет производительней.

Ну уж с GROUP BY никогда запрос не может быть быстрее, чем без него. Потому что подразумевает дополнительную операцию.
...
Рейтинг: 0 / 0
Помогите с запросом
    #33684815
iLLer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
При всем уважении к вам ребята, не могу не ответить.
MasterZiv: Я говорю про АСА, поэтому спорить с Вами даже и не собираюсь. В прошлый раз Вам доказал, что на счет АСА Вы ошиблись, в этот раз тоже самое будет.

ASCRUS:
В который раз убеждаюсь, что Вы относитесь с предвзятым отношением к высказываниям большинства участников форума. И занимаете позицию "Я тут самый главный и умный".

По существу:
1) Я в своем высказывании указал, что мои выводы являются результатом практической работы(т.е. не являются никаким гаданием, тем более на гуще).

2) Также в своем утверждении я указал, что направление, заданное ASCRUS, при выборе вида селекта является самым правильным, за исключением наличия третьей таблицы Goods. И отличие моего селекта - это отсутствие сканирования таблиц, полное отсутствие. А при связи через третью таблицу (как у ASCRUS) и отсутствии индекса по свойствам естественно будет сканирование, вот и разница.

3) Группировку следует вводить только в случае, когда у одного товара, может быть несколько значений одного свойства. Если (Товар,свойство) уникальная пара, то группировку нужно исключить.

4) ASCRUSMasterZiv: в ASA 9 запрос с 2 EXISTS в WHERE будет равнозначен моему запросу с 2-мя JOIN-ами.
Что значит равнозначен? По результату? Или по плану?
По результату да. По плану нет.

5) ASCRUSразличные варианты записи одних и тех же запросов на уровне оптимизатора будут иметь одинаковый план запроса - на моей памяти это утверждение верно всегда, кроме случая использования подзапроса в SELECT (т.е. SELECT (SELECT ...) FROM ...), который будет всегда выводится оптимизатором в плане запросов как Subquery по отношению к главному запросу. Так что я к примеру уже давно с таким оптимизатором бросил привычку изголятся куда поставить соединения - в JOIN, IN, EXISTS, DT, LATERAL - толку то, если оптимизатор все равно переделывает в запросе соединения и условия по наиболее оптимальному варианту - нам остается только выбирать форму записи руководствуясь читабельностью запроса и более краткой формой записи.
План разный. Привычку бросил - значит не возникает в этом потребности. Но я не говорю, что это плохо.
В доказательство приведу варианты одного и того же запроса (по смыслу) с планами:
Код: plaintext
1.
2.
3.
select tovar_id from tovar_spell_words as t2 where t2.spell_word_id= 430084  and t2.flag_locate= 1 
intersect
select tovar_id from tovar_spell_words as t2 where t2.spell_word_id= 430881  and t2.flag_locate= 1 ;
( Plan [ Total Cost Estimate: 2.472059344 ]
( WorkTable
( Intersect *HashIntersect
( IndexScan ( tovar_spell_words t2 ) spell_word_forms_fk[ t2.flag_locate = 1 : 100% Statistics ] )
( IndexScan ( tovar_spell_words t2 ) spell_word_forms_fk[ t2.flag_locate = 1 : 100% Statistics ] )
)
)
)
Код: plaintext
1.
2.
3.
4.
5.
select t1.tovar_id as g
from tovar_spell_words as t1
where 
exists(select  1  from tovar_spell_words as t2 where t1.tovar_id=t2.tovar_id and t2.spell_word_id= 430084  and t2.flag_locate= 1 ) and
exists(select  1  from tovar_spell_words as t2 where t1.tovar_id=t2.tovar_id and t2.spell_word_id= 430881  and t2.flag_locate= 1 );
( Plan [ Total Cost Estimate: 13.14004362 ]
( Keyset
( HashDistinct
( NestedLoopsJoin[ TRUE ]
( *HashJoin
( HashFilter
( HashFilter
( IndexScan ( tovar_spell_words t2 ) spell_word_forms_fk[ t2.flag_locate = 1 : 100% Statistics ] )
)
)
( IndexScan ( tovar_spell_words t2 ) spell_word_forms_fk[ ( hash( t2.tovar_id ) in hashmap( t2.tovar_id ) : 100% Guess ) AND ( hash( t2.flag_locate ) in hashmap( t2.flag_locate ) : 100% Guess ) AND ( t2.flag_locate = 1 : 100% Statistics ) ] )
)
( IndexScan ( tovar_spell_words t1 ) tovar_fk[ t1.tovar_id = t2.tovar_id : .0001358127% Column-Column ] )
)
)
)
)
Код: plaintext
1.
2.
3.
4.
5.
select t1.tovar_id as g
from tovar_spell_words as t1,tovar_spell_words as t2
where t1.tovar_id=t2.tovar_id and
	t1.spell_word_id= 430084  and t1.flag_locate= 1  and
	t2.spell_word_id= 430881  and t2.flag_locate= 1 ;
( Plan [ Total Cost Estimate: 2.491508344 ]
( WorkTable
( *HashJoin
( HashFilter
( HashFilter
( IndexScan ( tovar_spell_words t2 ) spell_word_forms_fk[ t2.flag_locate = 1 : 100% Statistics ] )
)
)
( IndexScan ( tovar_spell_words t1 ) spell_word_forms_fk[ ( hash( t1.tovar_id ) in hashmap( t2.tovar_id ) : 100% Guess ) AND ( hash( t1.flag_locate ) in hashmap( t2.flag_locate ) : 100% Guess ) AND ( t1.flag_locate = 1 : 100% Statistics ) ] )
)
)
)
Может показаться, что INTERSECT самый лучший вариант, но есть нюансы по которым выбор в его пользу неудачен.
Что касается distinct и group by, то выбор group by является более предпочтительным, ввиду природы алгоритма. Distinct это более уверсальное решение, но и менее гибкое и как следствие, возможно, менее производительное.
Код: plaintext
1.
2.
3.
4.
5.
select distinct t1.tovar_id as g
from tovar_spell_words as t1,tovar_spell_words as t2
where t1.tovar_id=t2.tovar_id and
	t1.spell_word_id= 430084  and t1.flag_locate= 1  and
	t2.spell_word_id= 430881  and t2.flag_locate= 1 ;
( Plan [ Total Cost Estimate: 2.802156594 ]
( WorkTable
( HashDistinct
( *HashJoin
( HashFilter
( HashFilter
( IndexScan ( tovar_spell_words t2 ) spell_word_forms_fk[ t2.flag_locate = 1 : 100% Statistics ] )
)
)
( IndexScan ( tovar_spell_words t1 ) spell_word_forms_fk[ ( hash( t1.tovar_id ) in hashmap( t2.tovar_id ) : 100% Guess ) AND ( hash( t1.flag_locate ) in hashmap( t2.flag_locate ) : 100% Guess ) AND ( t1.flag_locate = 1 : 100% Statistics ) ] )
)
)
)
)
Код: plaintext
1.
2.
3.
4.
5.
6.
select t1.tovar_id as g
from tovar_spell_words as t1,tovar_spell_words as t2
where t1.tovar_id=t2.tovar_id and
	t1.spell_word_id= 430084  and t1.flag_locate= 1  and
	t2.spell_word_id= 430881  and t2.flag_locate= 1 
group by g;
( Plan [ Total Cost Estimate: 2.696584094 ]
( WorkTable
( HashGroupBy
( *HashJoin
( HashFilter
( HashFilter
( IndexScan ( tovar_spell_words t2 ) spell_word_forms_fk[ t2.flag_locate = 1 : 100% Statistics ] )
)
)
( IndexScan ( tovar_spell_words t1 ) spell_word_forms_fk[ ( hash( t1.tovar_id ) in hashmap( t2.tovar_id ) : 100% Guess ) AND ( hash( t1.flag_locate ) in hashmap( t2.flag_locate ) : 100% Guess ) AND ( t1.flag_locate = 1 : 100% Statistics ) ] )
)
)
)
)
Оптимизатор у АСА умный, и даже очень, поэтому хочу повторить, что планы разные, и в некоторых случаях принципиально. Конечно смысла так ковырятся в широкораспространненых задачах - нет. Но у читателей форума может сложиться впечатление, что АСА и впрямь всемогущ и сделает все за нас, но это не так. Когда речь встает о базе объектов для поиска в 2 млн записей, и справочнике свойств в 10 млн все планы становятся очень даже принципиально разными, и это нужно помнить.

P.S.: К примеру есть еще один нюанс, связанный с тем, что например товаров с свойством 006 может быть много, а товаров с свойством 007 может быть один. И вот тут при построении запроса через JOIN оптимизатор это заценит, и воспользуется внешним ключом по товару, а в случае с запросом с применением EXIST или INTERSECT (а тем более вложенных селектов) его план будет менее гибким, ввиду вида запроса и будет тупо пересекать большие массивы данных.
...
Рейтинг: 0 / 0
Помогите с запросом
    #33684847
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iLLerASCRUS:
В который раз убеждаюсь, что Вы относитесь с предвзятым отношением к высказываниям большинства участников форума. И занимаете позицию "Я тут самый главный и умный".
В очередной раз я могу Вам сказать, что перед тем как что то говорить, я обычно это проверяю. Поэтому могу Вас сказать, что во первых проверил перед выкладкой сюда свое утверждение на тестовых таблицах с 3 миллионами товаров и 6 миллионами записей свойств, а потом выложил результаты сравнения моего и Ваших запросов сюда (как и следовало ожидать, в плане запроса не было таблицы Goods, так как использовалось всего одно ключевое поле, так что Ваши выссказывания о дополнительном сканировании таблицы абсолютно беспочвенны). Во вторых у автора топика нигде не было в условиях задачи, что одно свойство одного обьекта может иметь несколько значений. Ну а в третьих:
iLLerP.S.: К примеру есть еще один нюанс, связанный с тем, что например товаров с свойством 006 может быть много, а товаров с свойством 007 может быть один. И вот тут при построении запроса через JOIN оптимизатор это заценит, и воспользуется внешним ключом по товару, а в случае с запросом с применением EXIST или INTERSECT (а тем более вложенных селектов) его план будет менее гибким, ввиду вида запроса и будет тупо пересекать большие массивы данных.
Почитайте пожалуйста в BOL все главы: ASA SQL User's Guide/Query Optimization and Execution и заодно узнаете, что такое семантическое преобразование запроса перед его оптимизацией, почему и когда JOIN = EXISTS, почему DT может быть вынесен в основной план запрос и много еще интересных вещей.

P.S. Я вообще глядя на Ваши планы запросов ужасаюсь, почему в планах везде сплошные хэш алгоритмы обработки данных. Обычно оптимизатор использует их только в случае работы с большими обьемоми данных и отсутствием подходящих индексов на таблицах - здесь может быть действительно есть разница по планам запросов. У Вас вообще какая точная версия ASA используется ?
...
Рейтинг: 0 / 0
Помогите с запросом
    #33684883
iLLer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ASCRUS (как и следовало ожидать, в плане запроса не было таблицы Goods, так как использовалось всего одно ключевое поле, так что Ваши выссказывания о дополнительном сканировании таблицы абсолютно беспочвенны).
Пардон, но я этого не проверял, я доверился Вам:
ASCRUSДумаю не стоит говорить, сколько будет длиться поиск, если будет много товаров и свойств - на каждое условие поиска будет идти дополнительное сканирование таблицы Goods_Properties
Но может и не будет скана.
ASCRUS
Почитайте пожалуйста в BOL все главы: ASA SQL User's Guide/Query Optimization and Execution и заодно узнаете, что такое семантическое преобразование запроса перед его оптимизацией, почему и когда JOIN = EXISTS, почему DT может быть вынесен в основной план запрос и много еще интересных вещей.

Читал естественно, и Вы правильно подметили "почему и когда JOIN = EXISTS". Именно это я и говорю, что не всегда существует однозначное преобразование JOIN<->EXISTS.
ASCRUS
P.S. Я вообще глядя на Ваши планы запросов ужасаюсь, почему в планах везде сплошные хэш алгоритмы обработки данных. Обычно оптимизатор использует их только в случае работы с большими обьемоми данных и отсутствием подходящих индексов на таблицах - здесь может быть действительно есть разница по планам запросов. У Вас вообще какая точная версия ASA используется ?
Да, данных много, очень много. Индексы есть, точнее в качестве них ипсользуются внешние ключи и именно их АСА использует (в плане видно). Версия АСА902.3221(вроде). Раз АСА решил использовать хэш алгоритмы, значит ему так нужно, главное направить в нужное русло. На серваке стоит кэш еще не слабый, но это так, к слову пришлось.

P.S.: Мне вот не подходит вариант, с отдельными таблицами для каждого типа товара, т.к. нет такого понятия тип, т.е. он один этот тип, но при том раскладе, что одно свойство может иметь несколько значений. В качестве значения свойства товара выступает словоформа (т.е. в одном свойстве(текстовые данные) может встречаться несколько словоформ). Либо, если посмотреть иначе, словоформа это и есть свойство товара, а его значение это его позиция, тогда набор свойств(словоформ) для каждого товара в основном будет различным и сделать для каждого набора словоформ отдельную таблицу нереально. Резюме: в моей задаче возможен путь только с одной таблицей значений свойств товара, а поскольку такой вариант совпадает с вопросом автора, то я ему сообщаю, что лучше примененять запросы с JOINами, как наименее опасный путь(в этом случае мы меньше всего связываем руки оптимизатору АСА).
...
Рейтинг: 0 / 0
Помогите с запросом
    #33684885
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Рибята ниссортись !
...
Рейтинг: 0 / 0
Помогите с запросом
    #33684887
iLLer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да все нормально.)))
Обычное обсуждение в рабочем порядке.
...
Рейтинг: 0 / 0
Помогите с запросом
    #33685176
Владимор Конев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ASCRUSMasterZiv: в ASA 9 запрос с 2 EXISTS в WHERE будет равнозначен моему запросу с 2-мя JOIN-ами.Ну, раз уж речь зашла о ASA 9, то считаю, что там вообще не нужно ни джойна, ни экзиста...
Нужно просто заюзать аналитические функции:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
select * from t order by good_id

Query finished, retrieving results...

GOOD_ID  PROPERTY_ID  PROPERTYVALUE 
-------  -----------  ---------------- 
a13       0006          red
a13       0007          10x10
a14       0006          white
a15       0006          green
a15       0007          10x10
a16       0006          red
a16       0007          20x10

 7  row(s) retrieved

Что бы выдрать строки, удовлетворяющие обоим условиям (красный и 10х10), можно написать вот такой запрос с аналитическими функциями:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
select * 
  from (
          select t.* , 
                 sum(case
                        when property_id = '0006' and propertyvalue = 'red'
                             or
                             property_id = '0007' and propertyvalue = '10x10'
                        then  1 
                        else  0 
                     end) 
                 over(partition by good_id) as cnt
            from t
        )
 where cnt =  2 

Query finished, retrieving results...

GOOD_ID  PROPERTY_ID  PROPERTYVALUE  CNT
-------  -----------  -------------  ---
a13       0006          red               2 
a13       0007          10x10             2 

 2  row(s) retrieved
...
Рейтинг: 0 / 0
Помогите с запросом
    #33685193
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимор Конев:
Требуется список id товаров найти. Соотвествующе Вам еще Group by придется сверху вводить. Вместе с накладывающимся на аналитический запрос сверху фильтром "cnt = 2" все это на больших обьемах записей по идее будет не самым быстрым выполнением запроса.
...
Рейтинг: 0 / 0
Помогите с запросом
    #33685199
Владимор Конев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ASCRUSВладимор Конев:
Требуется список id товаров найти. Соотвествующе Вам еще Group by придется сверху вводить. Вместе с накладывающимся на аналитический запрос сверху фильтром "cnt = 2" все это на больших обьемах записей по идее будет не самым быстрым выполнением запроса.GROUP BY - В ТОПКУ...
Можно и DISTINCT заюзать.
Для уменьшения объема выборки (ну дабы аналитичекой функции легче работалось) необходимо указать все возможные условия фильтрации во фразе WHERE.
Как вариант:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
select distinct good_id
  from (
          select t.* , 
                 sum(case
                        when property_id = '0006' and propertyvalue = 'red'
                             or
                             property_id = '0007' and propertyvalue = '10x10'
                        then  1 
                        else  0 
                     end) 
                 over(partition by good_id) as cnt
            from t
           where case
                     when property_id = '0006' and propertyvalue = 'red'
                          or
                          property_id = '0007' and propertyvalue = '10x10'
                     then  1 
                     else  0 
                  end =  1 
        )
 where cnt =  2 
...
Рейтинг: 0 / 0
Помогите с запросом
    #33685212
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Какая разница - в топку GROUP BY или не в топку - по любому будет TABLE SCAN, что для таблички t с миллионами записей будет не самым удачных запросом.
...
Рейтинг: 0 / 0
Помогите с запросом
    #33685218
Владимор Конев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ASCRUSКакая разница - в топку GROUP BY или не в топку - по любому будет TABLE SCAN, что для таблички t с миллионами записей будет не самым удачных запросом.А ты думаешь, что при IN, JOIN, EXISTS скана таблицы не будет??? ;)

Кроме того, если итоговая выборка невелика, относительно общего объема таблицы, то весьма нетрудно посадить выборку на индекс.

Но, спорить не буду - Вам ASAшникам виднее, как оно работает.
...
Рейтинг: 0 / 0
Помогите с запросом
    #33685395
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимор Конев ASCRUSКакая разница - в топку GROUP BY или не в топку - по любому будет TABLE SCAN, что для таблички t с миллионами записей будет не самым удачных запросом.А ты думаешь, что при IN, JOIN, EXISTS скана таблицы не будет??? ;)

Кроме того, если итоговая выборка невелика, относительно общего объема таблицы, то весьма нетрудно посадить выборку на индекс.

Но, спорить не буду - Вам ASAшникам виднее, как оно работает.
Вот при JOIN/EXISTS/IN как раз выборка и посадится на INDEX SCAN, а WHERE CASE уйдет на TABLE SCAN и использовать индексы оптимизатор не будет. Это кстати насколько я понимаю, не только к ASA относится, но и любому РСУБД - хотел бы я увидеть сервер, который Ваш последний запрос на индексы подсадит для фильтрации по нужным условиям.
...
Рейтинг: 0 / 0
25 сообщений из 33, страница 1 из 2
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Помогите с запросом
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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