|
|
|
Формирование произвольного условия поиска. Я застрял на этом запросе
|
|||
|---|---|---|---|
|
#18+
я вас опять не понял. Вот пример: "найти все модели автомобилей не дороже $15000 И (масса < 6000 ИЛИ мощностью двигателя не менее 140 л.с. )?" Вот запрос. Код: plaintext 1. 2. 3. 4. Где тут full outer join? Даже если параметр 'Мощность двигателя' вообще не задан ни для одной машины, запрос выдаст те машины у которых масса < 6000 И стоимость <= 15000. (Еще раз уточню что так оно в MS SQL 2000) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2006, 14:14 |
|
||
|
Формирование произвольного условия поиска. Я застрял на этом запросе
|
|||
|---|---|---|---|
|
#18+
Дык ModelRЛибо логика генерации запроса будет непростая.. сравните Ваши запросы. А "найти все модели автомобилей не дороже $15000 И (масса < 6000 ИЛИ (мощностью двигателя не менее 140 л.с. И тип =дизель ))?" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2006, 15:14 |
|
||
|
Формирование произвольного условия поиска. Я застрял на этом запросе
|
|||
|---|---|---|---|
|
#18+
ModelRДык ModelRЛибо логика генерации запроса будет непростая.. сравните Ваши запросы. А "найти все модели автомобилей не дороже $15000 И (масса < 6000 ИЛИ (мощностью двигателя не менее 140 л.с. И тип =дизель ))?" Теперь понял :) Согласен, для данного примера составить запрос будет сложнее :) Вопрос в том, будут ли поддерживаться такие вложенные И-ИЛИ запросы клиентской частью? ;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2006, 17:57 |
|
||
|
Формирование произвольного условия поиска. Я застрял на этом запросе
|
|||
|---|---|---|---|
|
#18+
Доделал. По ходу работы я решил кое-что изменить. А именно: добавить 2 временные таблицы для хранения промежуточных результатов (там идентификаторы Vehicle – только одно поле). Запросы просто летают, тут даже потестил на большее, чем 10 число условий – базе пока что всё равно. Оно и понятно – сложных-то соединений нет. Данных, конечно, у меня пока немного, но вроде всё адекватно ищется. Почему сделал 2 временные тыблицы: я разбиваю сложный запрос на такие подзапросы: либо ...AND...AND... либо ...OR...OR... Там могут быть какие угодно условия, главное чтобы не пришлось возиться со сложным соединением таблиц. Я решил, что лучшее - враг хорошего и не стоит пихать в один запрос много таблиц со сложными соединениями. Тем более, что формировалось бы всё это автоматом и про производительность сложно было бы что-то сказать. А так, поэкспериментировал с различными формами этих простых запросов, убедился, что они достаточно эффективны и написал в программе функцию, которая разбирает запрос и образует список запросов в нужном порядке для последовательного выполнения. На каждом этапе после выполнения данные заносятся во временную таблицу, а потом производится либо объединение новых результатов с сохранёнными, либо пересечение. Что-то у меня не сработало в одной команде сначала объединение двух таблиц, а потом вставка их в третью. Это ограничение Firebird или я не так что-то делаю INSERT INTO T3 (ID) (SELECT ID FROM T1 UNION SELECT ID FROM T2) ? Я написал процедурку, которая делает эту вещь, но немного по-другому, без UNION. Но, вообще, странно… И вот у меня вопрос, а насколько эффективен запрос, состоящий из двух: основного, который в своём условии содержит конструкцию SELECT … WHERE ID IN (SELECT ID FROM SOMETABLE). И его пара NOT IN, понятно. Поля ID каждой из таблиц индексированы (первичные ключи). Сдаётся мне, что сервер быстро выполнит этот запрос, но где-то читал, что на больших объёмах таблиц оператор IN лучше не применять. Что скажете по этому поводу? Использовать его или нет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2006, 20:20 |
|
||
|
|

start [/forum/topic.php?fid=32&msg=33733565&tid=1545245]: |
0ms |
get settings: |
8ms |
get forum list: |
20ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
162ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
59ms |
get tp. blocked users: |
1ms |
| others: | 203ms |
| total: | 476ms |

| 0 / 0 |
