Форум: "Базы";
Текущий архив: 2005.10.09;
Скачать: [xml.tar.bz2];
ВнизПомогите оптимизировать SQL- запросик Найти похожие ветки
← →
Max Zyuzin © (2005-08-25 16:31) [0]Есть такая задача...
В наличие имеется объемная таблица №1 с 2-мя десятками полей.
Есть отдельная табличка №2, пусть будет называться фильтры в ней 5 полей часто используемых в табличке №1, в общем по маскам из этой таблички должны фильтроваться записи в основной таблице...
т.е. юзверь забивает один или несоклько таких вот фильтров в формочку, потом нажимает кнопочку и ему высвечивают основную таблицу, к которой применены вот эти самые фильтры. Вот как бы это лучше реализовать? Сейчас я доизвращался вот примерно до такого...
Динамичеси формирую запрос начало что то вродеselect * from Table1View, Table2View
where dDate between :fd and :td
.. а далее к запросу приплюсовываются вот таки блоки в цикле по "фильтрам" этимShpReqShpQuery.SQL.Add("( SRFV.srfRequestNumber = :ShpReqId"+inttostr(i) + " and SRFV.srfRequestDate = :ShpReqDate"+inttostr(i));
ShpReqShpQuery.SQL.Add(" and sDispatchStation = coalesce(SRFV.srfDispStation,sDispatchStation) ");
ShpReqShpQuery.SQL.Add(" and sDestinationStation = coalesce(SRFV.srfDestStation,sDestinationStation)");
ShpReqShpQuery.SQL.Add(" and sFreightETSNG = coalesce(SRFV.srfFreight,sFreightETSNG)");
ShpReqShpQuery.SQL.Add(" and CarType = coalesce( (select ctName from CarType where ctCode = SRFV.srfCarType), CarType )");
ShpReqShpQuery.SQL.Add(" and FreightSenderName = coalesce( (select fsName from FreightSender where fsCode = SRFV.srfFreightSender), FreightSenderName)");
ShpReqShpQuery.SQL.Add(")");
Все это работает мягко говоря неторопливо, вот сел я это все безобразие оптимизировать, думаю что не зря ли я в запрос вообще внес табличку с фильтрами? Мож ее стоило ввобще только как параметры использовать прогулявшись по ней в цикле?
А для чего я вот такое безобразие пол года назад писал даже вспомнить не могу :(and FreightSenderName = coalesce( (select fsName from FreightSender where fsCode = SRFV.srfFreightSender), FreightSenderName)
Ух...
← →
Val © (2005-08-25 16:53) [1]"...:ShpReqId"+inttostr(i) +...и т.д. - ? нельзя значение i засовывать в значение параметра и потом использовать этот параметр как положено?
← →
Max Zyuzin © (2005-08-25 17:17) [2]>Val © (25.08.05 16:53) [1]
Дело в том что ShpReqId"+inttostr(i) вот так вот делается что бы в запросе получисись параметры типа ShpReqId0, ShpReqId1, ShpReqId2... в общем то оно фактически и засовывается в параметр, только для того и предназначено что бы параметры были с номерами...
PS. Земляка с недавно прошедшим праздником!!!
← →
Val © (2005-08-25 18:09) [3]Дело в том..
сорри, торможу.
Честно говоря, похоже, я не врулил в объяснение проблемы - нельзя ли структуры таблиц и, на примере, процесс работы - как происходит фильтрация?
Почему требуется бегать по второй таблице, если пользователь выбирает все необходимые маски и их достаточно поставить в условие выборки из первой таблицы, как параметры?
PS. Спасибо, но Харьков не Ярославль ;)
← →
Max Zyuzin © (2005-08-26 08:46) [4]>Val © (25.08.05 18:09) [3]
В общем я тут подумал и решил все переделать решил выкинуть из запроса вообще таблицу в которой маски живут для первой, запрос стал иметь следующий вид
select * from Table1
where dDate between :fd and :td and (
(
......
) or
(
......
)
)
В местах где ..... в цыкле в зависимости от того есть ли в маске что добавляю условия типа Field1 = :field1 and ... в общем все теперь зависит от того на сколько этот самый фильтр заполнен, в результате стало все выполнятся в разы быстрее... вот.
PS. Я родился и вырос в Харькове... 15 лет там прожил.
← →
evvcom © (2005-08-26 09:32) [5]Используя MSSQL никак не можешь отвыкнуть от динамического формирования запроса на клиенте? На MSSQL вообще-то есть хранимые процедуры. Да и запрос без Query.SQL.Add воспринимается гораздо лучше.
← →
Val © (2005-08-26 11:43) [6]>[4] Max Zyuzin © (26.08.05 08:46)
Угу, так получше. А or там точно нужен, из-за чего он появляется в запросе?
>[5] evvcom © (26.08.05 09:32)
Не факт, что хп всегда заменяют динамический запрос. Есть смысл и в том и в другом.
← →
Max Zyuzin © (2005-08-26 12:39) [7]>Val © (26.08.05 11:43) [6]
OR появляется потому что фильтров может быть много после каждого набора условий из одного фильтра идет OR и дальше условия следуещего...
>evvcom © (26.08.05 09:32) [5]
Пытаюсь отучится... :(
← →
Val © (2005-08-26 12:47) [8]Если несколько фильтров, почему or, а не and? Судя по тому, что or в запросе статичен, не пользователь выбирает or это или and...
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2005.10.09;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.013 c