Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.10.09;
Скачать: CL | DM;

Вниз

Помогите оптимизировать 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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.029 c
3-1125279600
Булат
2005-08-29 05:40
2005.10.09
delphi база данных двойники


3-1123118093
Defunct
2005-08-04 05:14
2005.10.09
Как правильно закачивать в базу большие объемы данных?


3-1124878124
DeStranger
2005-08-24 14:08
2005.10.09
кодировка в Oracle


4-1123763802
NeoMaster
2005-08-11 16:36
2005.10.09
WM & Service & GUI


14-1126818913
Ego
2005-09-16 01:15
2005.10.09
Зигзица