Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Формирование произвольного условия поиска. Я застрял на этом запросе / 25 сообщений из 29, страница 1 из 2
11.05.2006, 21:54
    #33721564
Андрей - он же дядя Сэм
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Формирование произвольного условия поиска. Я застрял на этом запросе
Здравствуйте, форумчане sql.ru! Есть у меня задачка. Чтобы не рассредоточивать внимания на несущественное, несколько упрощу ситуацию, отброшу всё лишнее. Есть две таблицы: DATA (главная) и VALUES (подчинённая). Структура таблицы DATA:

Int Vehicle, /*Номер марки автомобиля*/
Int Property /*Номер характеристики*/

Собственно эти два поля и являются составным первичным ключом, а поля по отдельности ссылаются на другие таблицы (т.е. внешние ключи, но в контексте моего вопроса эти таблицы не приводятся, т.к. достаточно знать, что они просто существуют).

Int Vehicle, /*Номер марки автомобиля*/
Int Property, /*Номер характеристики*/
Int Index, /*Номер значения характеристики для данных Vehicle и Property */
DOUBLE MINVALUE, /*Нижнее значение интервала-значения характеристики */
DOUBLE MAXVALUE /*Верхнее значение интервала-значения характеристики*/

Поля Vehicle, Property и Index являются составным первичным ключом. Как я уже писал, они связаны с соответствующими полями в главной таблице. Т.е. пусть есть автомобиль марки с номером Vehicle. Если у него есть характеристики, то узнать какие они можно из таблицы DATA. Так как характеристики могут состоять из нескольких интервальных значений, то нужно обратиться к таблице VALUES и выбрать все записи с нужными значениями в полях Vehicle и Property. Если характеристика не интервальная, а точечная, то MINVALUE = MAXVALUE. В целом же, MINVALUE <= MAXVALUE.

Теперь собственно моё затруднение. Пользователь может формировать запросы со многими условиями (а я формирую их динамически в коде программы). Например, найти все модели автомобилей не дороже $15000 ИЛИ мощностью двигателя не менее 140 л.с. (обратите внимание на соединение условий с помощью слова «ИЛИ») – нет никаких затруднений:

SELECT VEHICLE FROM VALUES WHERE
( (PROPERTY = 11) AND (MAXVALUE <= 15000) ) OR ( (PROPERTY = 2) AND (MINVALUE >= 140) )

А вот пример другого запроса: найти все модели автомобилей не дороже $15000 И мощностью двигателя не менее 140 л.с. (обратите внимание на слово «И»). Вот тут-то и возник вопрос: а как найти эти записи? Дело в том, что от меня требуется сделать такую поисковую систему, которая позволяла бы пользователю формировать достаточно сложные запросы: чтобы он мог составить условие, скажем, по пяти разным характеристикам с использованием связок «И», «ИЛИ». Т.е. я хочу сказать, что заранее неизвестно число подусловий (если так можно сказать, т.е. элементарных условий) и какие логические операторы и сколько их (в смысле, сколько «И», а сколько «ИЛИ», понятно общее число их известно и они взаимосвязаны) будут использованы.

Как вариант – выполнять поиск по каждому элементарному условию, сохранять результаты в программе, а потом уже работать со списками и обрабатывать то, что получилось с помощью логических операторов. Т.е. для пяти элементарных запросов я создаю пять списков и выполняю эти пять элементарных запросов с занесением информации в соответствующие списки. Затем я смотрю на логические операторы между элементарными условиями и программно (не в SQL) получаю результирующий список путём объединения/нахождения общих элементов в пяти списков в соответствии с логическими операторами и последовательностями действий. В этом варианте мне не нравится то, что придётся для каждого элементарного условия заново производить поиск, ну и то, что какое-то из условий может совсем незначительно сузить полное множество марок автомобилей и мне в одном из подзапросов вернутся практически все записи из таблицы автомобилей.

Или это нормальный вариант? Если нет, то какие возможны альтернативы?

P.S. Может я зациклился сегодня уже на этом вопросе и он элементарен? В голову лезут всякие подзапросы (но мне кажется, что это будет или медленно или … не знаю, такое чувство, что произвольное число условий где-нибудь выйдет боком). В принципе, их может быть действительно много (марок автомобилей).

P.P.S. Произвольное число условий – это произвольное число, но РАЗУМНОЕ, т.е. небольшое (думаю уж всяко <= 10). СУБД – Firebird 1.5.3.
...
Рейтинг: 0 / 0
12.05.2006, 10:16
    #33722142
ModelR
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Формирование произвольного условия поиска. Я застрял на этом запросе
Андрей - он же дядя Сэм
Int Vehicle, /*Номер марки автомобиля*/
Int Property, /*Номер характеристики*/
Int Index, /*Номер значения характеристики для данных Vehicle и Property */
DOUBLE MINVALUE, /*Нижнее значение интервала-значения характеристики */
DOUBLE MAXVALUE /*Верхнее значение интервала-значения характеристики*/

Поля Vehicle, Property и Index являются составным первичным ключом.
И что будет означать
VehicleProperty IndexMINVALUEMAXVALUEМодель1Масса140004000 Модель1Масса260006000
...
Рейтинг: 0 / 0
12.05.2006, 10:27
    #33722178
sti
sti
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Формирование произвольного условия поиска. Я застрял на этом запросе
авторP.P.S. Произвольное число условий – это произвольное число, но РАЗУМНОЕ, т.е. небольшое (думаю уж всяко <= 10). СУБД – Firebird 1.5.3.
Дак все же число условий ограничено?
Если да, то все сразу становится просто. Не нужна никакая динамика, ведь можно написать запросы для всех возможных вариантов. Я не знаю Firebird, но исхожу из принципа, что динамика это не есть хорошо в любом случае.

Мы у себя сочли возможным ограничиться 4-мя условиями в задаче, чем-то аналогичной данной.
...
Рейтинг: 0 / 0
12.05.2006, 10:53
    #33722267
gardenman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Формирование произвольного условия поиска. Я застрял на этом запросе
2 Ancle Sam
А вы не пытались рассмотреть возможность использования XML в вашей баз данных? Наиболее ходовые характеристики можно было бы выложить в простую таблицу, а прочие - хранить в виде XML. И юзать XQuery.
...
Рейтинг: 0 / 0
12.05.2006, 11:48
    #33722480
ModelR
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Формирование произвольного условия поиска. Я застрял на этом запросе
В лоб.
Использовать представление (подзапрос), разворачивающий нужные параметры каждый в свою колонку для каждой пары Vehicle, Index
В несколько других обозначениях:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
CREATE TABLE EAV_Value(
  EntId   NUMBER( 17 , 0 ) NOT NULL ,
  AttrId   NUMBER( 17 , 0 ) NOT NULL,
  Val VARCHAR2( 100 ) NULL
);
/
ALTER TABLE EAV_Value
ADD FOREIGN KEY (EntId ) REFERENCES EAV_Entity(EntId );
/
ALTER TABLE EAV_Value
ADD FOREIGN KEY (AttrId ) REFERENCES EAV_Attribute(AttrId);
/
ALTER TABLE EAV_Value
ADD UNIQUE (EntId ,AttrId ) ;
/
select
  z.EntId, 
  min(case when z.AttrId =   7  then z.val else null end) prop1,
  min(case when z.AttrId =  12  then z.val else null end) prop2,
  min(case when z.AttrId =  17  then z.val else null end) prop3
from
  EAV_Value z
where
  z.attrid in ( 7 , 12 , 17 )
group by
  z.EntId
К полученному представлению применить условия на параметры обычным путем.
Универсально, для любых И/ИЛИ комбинаций.
...
Рейтинг: 0 / 0
12.05.2006, 18:25
    #33723927
rgb-dart
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Формирование произвольного условия поиска. Я застрял на этом запросе
Я не знаю синтаксис Firebird, напишу как можно решать проблему ANDов в MS SQL 2000.

Запрос:
"Хотим машины не дороже 15000 И объемом двигателя не меньше 140"

Код: plaintext
1.
2.
3.
4.
5.
SELECT t1.VEHICLE 
FROM VALUES t1 inner join 
     VALUES t2 on t1.VEHICLE = t2.VEHICLE
WHERE
   (t1.PROPERTY =  11 ) AND (t1.MAXVALUE <=  15000 )  
AND  (t2.PROPERTY =  2 ) AND (t2.MINVALUE >=  140 ) 

join'ов будет столько сколько связок И есть в запросе.
...
Рейтинг: 0 / 0
12.05.2006, 21:39
    #33724205
Андрей - он же дядя Сэм
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Формирование произвольного условия поиска. Я застрял на этом запросе
Спасибо за внимание к задаче (и за мозговой штурм )! Вроде что-то вырисовывается – пока не буду писать - сегодня обдумаю и завтра попробую реализовать, позже опишу результаты.

Теперь отвечу на предыдущие сообщения, а в конце задам ВОПРОС, родившийся по ходу чтения обсуждения:

-----------------------------------------------------------------

2 ModelR в ответ на вопрос:

И что будет означать

Vehicle Property Index MINVALUE MAXVALUE
Модель1 Масса 1 4000 4000
Модель1 Масса 2 6000 6000

Я понял, что Вы имеете в виду. В приведённом Вами примере не нужно хранить две записи (т.е. для характеристики «масса»). Конечно, в этом случае будет только одна запись с Index = 1 (или 0, но, опять же, одна запись). Просто есть такие характеристики, у которых может быть несколько возможных значений: например, в разных режимах езды (город/скоростное шоссе) различный расход топлива. Т.е. характеристика одна (расход топлива), а значения два. Чтобы предупредить дальнейшие вопросы, я повторю, что я упростил задачу и саму структуру таблиц и оставил только самое существенное, в моей программе учитываются и режимы и другие особенности. Мне показалось логичным не перегружать задачу деталями.

2 sti: Откровенно говоря, 10 вариантов я вряд ли осилю (это ж вроде (512 + 256 +128 +64 + 32 + 16 + 8 + 4 + 2) = (1024 – 2) вариантов различных запросов; даже если оптимизировать по перестановкам, то всё равно много), хотя если будет вызывать слишком большие с точки зрения пользователей задержки, и этого числа будет много, то попробую уменьшить максимальное число одновременных условий и сформировать заранее. Надо всё-таки попробовать и то и другое, хотя бы на паре-тройке разных запросов (и по сложности тоже).

2 gardenman: С XQuery я не знаком. Посмотрю, что это такое, но, боюсь, это не подойдёт, если нельзя искать по XML-данным. Искать в том смысле, что вряд ли удастся выделить самые ходовые, так как есть разные категории пользователей и, соответственно, им нужны различные характеристики при работе. Таким образом, если это принципиально, то вроде бы не очень подходит. Но раз уж взялся за такое дело, то надо посмотреть, что такое XQuery и с чем его едят.

2 ModelR и rgb-dart: Ваши варианты мне понятны. С двумя псевдонимами вроде как быстро будет работать, но насколько эффективно это будет в случае 5-7 условий (самый сложный случай, когда все «И» и ни одного «ИЛИ»)? Запрос будет достаточно простой в смысле синтаксиса и мне это нравится. Что касается варианта с подзапросом, то это натолкнуло меня на один вариант, его я и хочу обдумать.

-----------------------------------------------------------------

ВОПРОС: Некоторые книги по реляционным базам данных не рекомендуют в одном запросе использовать больше 3-5 таблиц. Условие в моей задаче может содержать 10 элементарных условий (смотрите первое сообщение в теме). По сути, все значения характеристик содержатся в одной таблице. Не выродится ли, в конечном счете, сложное условие к такому запросу, который приведёт к упомянутой проблеме обращения к большому количеству таблиц? Я имею в виду, конечно, не сами таблицы, а соединения, которые стоят за этой проблемой.
...
Рейтинг: 0 / 0
12.05.2006, 22:24
    #33724249
iscrafm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Формирование произвольного условия поиска. Я застрял на этом запросе
"...заранее неизвестно число подусловий...":

Таблица авто tauto:
id,
name

Таблица параметров tparms:
id,
name

Таблица значений параметров tparmsval:
id,
auto_id,
param_id
param_value

запрос для поиска авто по неопределенному множеству параметров (для условия И, т.е. найденные записи должны соответствовать всем заданным условиям):

Код: plaintext
1.
2.
select d.*
from tauto d
where (select count(*) from tparmsval where autoi_id = d.id and (:p1)) = :p2

:p1 - перечень условий запроса пользователя
в форме (param_id = ... and param_value = [>,<] ...) or (...)
:p2 - количество условий

Параметры "формирую ... динамически в коде программы".
Примерно так. Может поможет, в принципе задача похожая. На рис интерфейс поиска информации заданного вида по неопределенному числу параметров.
...
Рейтинг: 0 / 0
12.05.2006, 22:27
    #33724254
iscrafm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Формирование произвольного условия поиска. Я застрял на этом запросе
p.s. синтаксис запроса именно для FB. В MS SQL выглядит немного по другому, там селекты можно джойнить.
...
Рейтинг: 0 / 0
12.05.2006, 22:57
    #33724283
iscrafm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Формирование произвольного условия поиска. Я застрял на этом запросе
pps:)
Сразу не сообразил. Здесь флешка, которая показывает работу этой схемы "вживую" (2.4МБ). Данные убраны только.
...
Рейтинг: 0 / 0
14.05.2006, 21:14
    #33725654
Андрей - он же дядя Сэм
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Формирование произвольного условия поиска. Я застрял на этом запросе
2 iscrafm: Я вот не совсем понял, а можно написать последовательно (со скобками, как в Вашем условии WHERE) десяток подзапросов (будет десять WHERE с SELECT’ами)? Т.е. я хочу, чтобы они выполнились именно в порядке, начиная с "самого внутреннего" и не использовали лишние соединения. Вроде как сервер будет создавать в памяти псевдотаблицу и с ней работать. Только сделать это нужно будет десять раз подряд. Потянет Firebird 1.5.3 это? И нет ли ограничения на длину строки (в символах) запроса?

Т.е. сможет ли сервер так обработать строку этого одного достаточно сложного по вложенности запроса так, чтобы выполнить эти действия как будто бы используется 10 различных запросов, а результаты заносятся во временную таблицу. Ну, берём самый внутренний запрос (он же, понятно, будет первым условием), выполняем, получаем результаты (ключевые поля) и тут же заносим их во временную таблицу. Далее, берём следующее условие поиска, выполняем его, а полученные результаты объединяем/находим пересечение с записями из временной таблицы, тем самым, получая новую таблицу и сохраняя её вместо предыдущей. И так до тех пор, пока не кончатся условия. Только всё это делается в памяти сервера (по возможности, конечно).

ПОДВОДЯ ИТОГ: В общем, вопрос состоит в том, поймёт ли сервер, что выполнять нужно последовательно, как будто это десять запросов. Или всё-таки сделать это в коде программы (самому хранить список ключевых полей) или, как вариант, действительно создать временную таблицу и в неё заносить промежуточные данные? Есть принципиальные возражения? На практике я завтра проверю, написав подобный запрос, но пока что данных у меня не много и при имеющейся линейной зависимости от размера таблицы я могу получить бомбу замедленного действия, которая проявит себя во время эксплуатации программы.

Вариант с подзапросами, на мой взгляд, самый простой, так как используется простое одиночное условие и связывается всё это добро неким подобием цикла.
...
Рейтинг: 0 / 0
14.05.2006, 23:06
    #33725727
iscrafm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Формирование произвольного условия поиска. Я застрял на этом запросе
Андрей, я не понял зачем Вам 10 подзапросов. Суть предложенного метода в том, чтобы считать количество соответствий записей в главной таблице и одной выборке. Что будет в этой выборке Вы задаете в ее условии WHERE. Очевидно, что если количество совпадений равно заданному количеству условий, то выполняется И, т.е. запись полностью удовлетворяет заданным условиям. Если меньше - то запись соответствует хотя-бы одному из условий, если равно 0 - запись не попадает в выборку. Вместо 10 подзапросов управляйте условиями здесь: select count(*) from tparmsval where autoi_id = d.id and ( :p1 ). Может конечно у Вас еще хитрей задача? А если условий более 10? Ради интереса в MS SQL например смоделируйте свой запрос и посмотрите план исполнения.
...
Рейтинг: 0 / 0
15.05.2006, 00:25
    #33725783
braindancer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Формирование произвольного условия поиска. Я застрял на этом запросе
А почему все же в данном случае не формировать условие отбора на уровне клиента и не передавать всю подстроку 'WHERE ...' процедуре, которая "склеит" запрос? Чем это чревато?
...
Рейтинг: 0 / 0
15.05.2006, 11:04
    #33726340
ModelR
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Формирование произвольного условия поиска. Я застрял на этом запросе
iscrafm "...заранее неизвестно число подусловий...":

Таблица авто tauto:
id,
name

Таблица параметров tparms:
id,
name

Таблица значений параметров tparmsval:
id,
auto_id,
param_id
param_value

запрос для поиска авто по неопределенному множеству параметров (для условия И, т.е. найденные записи должны соответствовать всем заданным условиям):

Код: plaintext
1.
2.
select d.*
from tauto d
where (select count(*) from tparmsval where autoi_id = d.id and (:p1)) = :p2

:p1 - перечень условий запроса пользователя
в форме (param_id = ... and param_value = [>,<] ...) or (...)
:p2 - количество условий

Не совсем понял:
Все связки ИЛИ
(select count(*) ... ) >= 1,
Все связки И
(select count(*) ... ) = N.
А как быть если
найти все модели автомобилей не дороже $15000 И (масса < 6000 ИЛИ мощностью двигателя не менее 140 л.с. )?
...
Рейтинг: 0 / 0
15.05.2006, 14:57
    #33727442
iscrafm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Формирование произвольного условия поиска. Я застрял на этом запросе
2 ModelR
--
Тут я немного перегнул. Это алгоритм для поиска, когда число характеристик тоже заранее не определено. Для задачи с авто, где в общем-то число параметров относительно фиксированно, нужна другая структура данных.
...
Рейтинг: 0 / 0
16.05.2006, 10:00
    #33729038
ModelR
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Формирование произвольного условия поиска. Я застрял на этом запросе
iscrafm2 ModelR
--
Тут я немного перегнул. Это алгоритм для поиска, когда число характеристик тоже заранее не определено. Для задачи с авто, где в общем-то число параметров относительно фиксированно, нужна другая структура данных.Вопрос не в числе параметров (к моменту запроса все они в любом случае известны), а логике поиска. Ваша методика подходит наверно к оценке релевантности по заданному множеству критериев. Типа выдать авто удовлетворяющие не менее чем 75% из N критериев

Код: plaintext
1.
2.
3.
select d.*, (select count(*) from tparmsval where autoi_id = d.id and (:p1)) r
from tauto d
where (select count(*) from tparmsval where autoi_id = d.id and (:p1)) >= N* 75 %
order by r descending
В задаче же требуется точное выполнение заданного предиката из критериев.
Структура данных конечно может быть горизонтальной, но использованная EAV-структура не есть препятсвие как показано.
...
Рейтинг: 0 / 0
16.05.2006, 10:49
    #33729184
iscrafm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Формирование произвольного условия поиска. Я застрял на этом запросе
ModelRВаша методика подходит наверно к оценке релевантности по заданному множеству критериев.
Да, именно в таком приложении она и используется, я ж говорю, погорячился :). И число самих характеристик заранее неизвестно.

ModelRиспользованная EAV-структура не есть препятсвие как показано.
При известном числе параметров - конечно без проблем. Если не известно заранее, то то что MS SQL хорошо (в Вашем примере) - FireBirdу смерть :) Я имею ввиду вложенный запрос для развертки в горизонтальную таблицу по которой потом будет выполняться выборка.
...
Рейтинг: 0 / 0
16.05.2006, 12:27
    #33729505
ModelR
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Формирование произвольного условия поиска. Я застрял на этом запросе
2 iscrafm
--
По-прежнему не пойму фактор известное/неизвестное число параметров. :(
Как раз
Подзапрос развертки в горизонтальную таблицу формируется только для посковых параметров данного запроса. Как сказано их в пределах десяти.
Параметров вообще могут быть и сотни.
Как вытащить значения всех параметров? - это уже следующий вопрос. Картинки там и прочее.
Может, попытка засунуть все в один селект и убьет FireBird, но для поисковых параметров + еще несколько информационных ИМХО должно прокатить.
...
Рейтинг: 0 / 0
16.05.2006, 12:32
    #33729529
ModelR
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Формирование произвольного условия поиска. Я застрял на этом запросе
Сорри, опечатка.

Как раз переменное число параметров - повод чтобы использовать EAV структуру. Тем более задачка типа каталога, не поток транзакций.
...
Рейтинг: 0 / 0
16.05.2006, 12:51
    #33729595
iscrafm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Формирование произвольного условия поиска. Я застрял на этом запросе
ModelR2 iscrafm
--
По-прежнему не пойму фактор известное/неизвестное число параметров. :(

Фиксированное число параметров: марка, объем двигателя, база, обороты и т.п. - заданы в системе и на них написана процедура развертки (если храниться в структуре EAV). Произвольное, это когда пользователь сам создает эти параметры, привязывает их значения к записям каталога и использует их в запросах. В этом случае процедуру развертки нужно строить динамически. Это и имелось ввиду. Только если в MS SQL можно написать
select * from (select case ...) where ..., сформировать этот запрос на клиенте и передать на исполнение,
то в FB такое не катит, дело не в том, что убьет или не убьет. Просто несколько сложнее.
...
Рейтинг: 0 / 0
16.05.2006, 16:13
    #33730317
rgb-dart
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Формирование произвольного условия поиска. Я застрял на этом запросе
Андрей - он же дядя Сэм
2 ModelR и rgb-dart: Ваши варианты мне понятны. С двумя псевдонимами вроде как быстро будет работать, но насколько эффективно это будет в случае 5-7 условий (самый сложный случай, когда все «И» и ни одного «ИЛИ»)?


Мне кажется с эффективностью здесь проблем не будет. По крайне мере, MS SQL строит план запроса таким образом, чтобы сначала отрезать по WHERE-условию данные в таблицах, а потом связывать полученные наборы JOINами.

Пример запроса
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
select t1.*
  from dbo.[VALUES] t1 inner join 
       dbo.[VALUES] t2 ON t2.Vehicle = t1.Vehicle inner join 
       dbo.[VALUES] t3 ON t3.Vehicle = t2.Vehicle inner join 
       dbo.[VALUES] t4 ON t4.Vehicle = t3.Vehicle inner join 
       dbo.[VALUES] t5 ON t5.Vehicle = t4.Vehicle
  where
      (t1.Property =  12  and t1.MINVALUE >  100 ) and
      (t2.Property =  15  and t2.MINVALUE <=  1000 ) and
      (t3.Property =  16  and t3.MINVALUE >  255 ) and
      (t4.Property =  18  and t4.MINVALUE <  100 ) and
      (t5.Property =  22  and t5.MINVALUE =  800 )

Скриншот плана прилагается :)
...
Рейтинг: 0 / 0
16.05.2006, 17:42
    #33730652
ModelR
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Формирование произвольного условия поиска. Я застрял на этом запросе
rgb-dartМне кажется с эффективностью здесь проблем не будет. По крайне мере, MS SQL строит план запроса таким образом, чтобы сначала отрезать по WHERE-условию данные в таблицах, а потом связывать полученные наборы JOINами.В Вашем примере все связки И, а для реализации ИЛИ потребуется full outer Join. Либо логика генерации запроса будет непростая (inner/outer), либо, если все тупо заменить на full outer , насчет плана в FB сомневаюсь...
...
Рейтинг: 0 / 0
16.05.2006, 19:06
    #33730903
Андрей - он же дядя Сэм
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Формирование произвольного условия поиска. Я застрял на этом запросе
Кстати, в Firebird последний вариант на практике не вызвал каких-либо осложнений - какие только запросы не строил (сначала руками, потом уже и автоматом из программы) - быстро, даже очень быстро. Скоро реализую автоматический поиск для совместных "и" + "или", но, наверное, если не всё будет гладко (а ещё ведь нужно учесть порядок выполнения операторов - по отдельности для одинаковых это было неважно, но теперь...), буду хранить промежуточные данные в спец. таблице или в памяти программы. По отдельности "И", "ИЛИ" работают очень быстро. Было б неплохо сказать Firebird: я хочу создать виртуальную таблицу в памяти и с ней работать, чтобы хранить промежуточные запросы, а потом я очищу её. Нет ли такого варианта? Я выберу нужные ключевые поля и занесу их в эту таблицу, а в следующем запросе сошлюсь на них, как на обычную таблицу. Это же, наверное, быстро будет для коротких ключей (int)? После поиска я удалю все записи из виртуальной таблицы. Можно ли тут как-то ускорить работу с обычной таблицей в этом случае?
...
Рейтинг: 0 / 0
17.05.2006, 09:31
    #33731610
rgb-dart
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Формирование произвольного условия поиска. Я застрял на этом запросе
ModelR rgb-dartМне кажется с эффективностью здесь проблем не будет. По крайне мере, MS SQL строит план запроса таким образом, чтобы сначала отрезать по WHERE-условию данные в таблицах, а потом связывать полученные наборы JOINами.В Вашем примере все связки И, а для реализации ИЛИ потребуется full outer Join. Либо логика генерации запроса будет непростая (inner/outer), либо, если все тупо заменить на full outer , насчет плана в FB сомневаюсь...

Почему обязательно full outer join? Связки ИЛИ делаются через OR внутри таблиц. Просто where-условие немного раздуется. А план останется таким же.
...
Рейтинг: 0 / 0
17.05.2006, 12:46
    #33732344
ModelR
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Формирование произвольного условия поиска. Я застрял на этом запросе
rgb-dartПочему обязательно full outer join? Связки ИЛИ делаются через OR внутри таблиц. Просто where-условие немного раздуется. А план останется таким же.Потому что значение парметра может вообще отсутствовать.
Vehicle Property VALUE Модель1Масса 4000
Вопрос: Масса <= 4000 ИЛИ Мощность> 100.
Ожидаемый ответ: Модель1.
...
Рейтинг: 0 / 0
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Формирование произвольного условия поиска. Я застрял на этом запросе / 25 сообщений из 29, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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