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

Вниз

Помогите с решением запроса   Найти похожие ветки 

 
снежок   (2010-04-23 14:26) [0]

Привет!

В общем, нужно оптимизировать задачу. Весь мозг уже сломал.
На данный момент имеем запрос:
SELECT PLACELIST.*, RAIONS.NAME RNAME, PLACES.C_NAME PNAME, PLACES.SIDE_COUNT SC FROM PLACELIST
     INNER JOIN PLACES ON (PLACES.ID=PLACELIST.C_TYPE)
     INNER JOIN RAIONS ON (RAIONS.ID=PLACELIST.C_RAIONID)

который выдает весь список размещений, который имеется в базе.

Задача в следующем: нужно для каждой записи размещения (а в каждой записи может быть PLACES.SUDE_COUNT (количество сторон) от 1 до 8 и для каждой из них нужно вытащить из другой таблицы (ZAKAZY) наличие или отсутствие записей, соответствующих данному размещению и данной стороне.

Сейчас я сделал так: сначала заполняю грид данными, а потом в цикле пробегаюсь по каждой ячейке и запрашиваю COUNT. Но для 10 записей это занимает 3 секунды, а записей в таблице PLACELIST около тысячи...

Собственно вопрос: как можно составить запрос таким образом, чтобы в ответ он выдавал что-то типа:

[НазваниеРазмещения] [НомерСтороны] [Кол-во заказов]

и так далее?

Премного благодарен. Firebird 2.


 
Виталий Панасенко(дом)   (2010-04-23 14:32) [1]

а не пробовал вместо грида(вообще-то он только показывает, а данные в датасете, к нему привязанному) использовать EXECUTE BLOCK+курсор?


 
снежок   (2010-04-23 14:37) [2]

я поэтому и спрашиваю как лучше. я не знаю, как пользоваться execute block. мне бы примерчик :-)


 
Виталий Панасенко(дом)   (2010-04-23 14:45) [3]

SQL Language Extension: EXECUTE BLOCK

Function:
Allow execute PL-SQL block as if it is stored procedure.
Supports input and output parameters

Autor:
Vlad Horsun <horsun@kdb.dp.ua>

Syntax:
EXECUTE BLOCK [ (param datatype = ?, param datatype = ?, ...) ]
 [ RETURNS (param datatype, param datatype, ...) }
AS
[DECLARE VARIABLE var datatype; ...]
BEGIN
...
END

Client-side:
The call isc_dsql_sql_info with parameter isc_info_sql_stmt_type returns
- isc_info_sql_stmt_select, if block has output parameters.
Semantics of a call is similar to SELECT query - client has open cursor,
can fetch data from it, and must close it after use.

- isc_info_sql_stmt_exec_procedure, if block has no output parameters.
Semantics of a call is similar to EXECUTE query - client has no cursor,
execution runs until first SUSPEND or end of block

The client should preprocess only head of the SQL statement or use "?"
instead of ":" as parameter indicator because in a body of the block may be links
to local variables and \ or parameters with a colon ahead.

Example:
User SQL is
 EXECUTE BLOCK (X INTEGER = :X) RETURNS (Y VARCHAR)
 AS
 DECLARE V INTEGER;
 BEGIN
   INSERT INTO T(...) VALUES (... :X ...);

   SELECT ... FROM T INTO :Y;
   SUSPEND;
 END

Preprocessed SQL is
 EXECUTE BLOCK (X INTEGER = ?) RETURNS (Y VARCHAR)
 AS
 DECLARE V INTEGER;
 BEGIN
   INSERT INTO T(...) VALUES (... :X ...);

   SELECT ... FROM T INTO :Y;
   SUSPEND;
 END

каталог doc\sql.extensions - там много интересного.. EXECUTE BLOCK позволяет как-бы исполнять скрипт.. ал-ля ХП, но без создания оных в БД


 
Виталий Панасенко(дом)   (2010-04-23 14:45) [4]

SQL Language Extension: EXECUTE BLOCK

Function:
Allow execute PL-SQL block as if it is stored procedure.
Supports input and output parameters

Autor:
Vlad Horsun <horsun@kdb.dp.ua>

Syntax:
EXECUTE BLOCK [ (param datatype = ?, param datatype = ?, ...) ]
 [ RETURNS (param datatype, param datatype, ...) }
AS
[DECLARE VARIABLE var datatype; ...]
BEGIN
...
END

Client-side:
The call isc_dsql_sql_info with parameter isc_info_sql_stmt_type returns
- isc_info_sql_stmt_select, if block has output parameters.
Semantics of a call is similar to SELECT query - client has open cursor,
can fetch data from it, and must close it after use.

- isc_info_sql_stmt_exec_procedure, if block has no output parameters.
Semantics of a call is similar to EXECUTE query - client has no cursor,
execution runs until first SUSPEND or end of block

The client should preprocess only head of the SQL statement or use "?"
instead of ":" as parameter indicator because in a body of the block may be links
to local variables and \ or parameters with a colon ahead.

Example:
User SQL is
 EXECUTE BLOCK (X INTEGER = :X) RETURNS (Y VARCHAR)
 AS
 DECLARE V INTEGER;
 BEGIN
   INSERT INTO T(...) VALUES (... :X ...);

   SELECT ... FROM T INTO :Y;
   SUSPEND;
 END

Preprocessed SQL is
 EXECUTE BLOCK (X INTEGER = ?) RETURNS (Y VARCHAR)
 AS
 DECLARE V INTEGER;
 BEGIN
   INSERT INTO T(...) VALUES (... :X ...);

   SELECT ... FROM T INTO :Y;
   SUSPEND;
 END

каталог doc\sql.extensions - там много интересного.. EXECUTE BLOCK позволяет как-бы исполнять скрипт.. ал-ля ХП, но без создания оных в БД


 
Виталий Панасенко(дом)   (2010-04-23 14:46) [5]

вах.. Укртелеком глючит..извиняюсь за повтор


 
Sergey13 ©   (2010-04-23 15:06) [6]

> [0] снежок   (23.04.10 14:26)

Не уверен что правильно понял вопрос, но (по тому как понял) можно попробовать

SELECT PLACELIST.*, RAIONS.NAME RNAME, PLACES.C_NAME PNAME, PLACES.SIDE_COUNT SC,
 (select count(*) from zakazy where ...) count_zakaz
    FROM PLACELIST
    INNER JOIN PLACES ON (PLACES.ID=PLACELIST.C_TYPE)
    INNER JOIN RAIONS ON (RAIONS.ID=PLACELIST.C_RAIONID)


 
снежок   (2010-04-23 15:21) [7]


> Sergey13 ©   (23.04.10 15:06) [6]

см. скриншот
http://img243.imageshack.us/img243/8866/scrn1.png


 
снежок   (2010-04-23 15:24) [8]

Кстати, твое решение с count не подходит, т.к. оно считает _все_ совпадения без учета номера стороны...


 
Sergey13 ©   (2010-04-23 15:35) [9]

> [8] снежок   (23.04.10 15:24)
> т.к. оно считает _все_ совпадения без учета номера стороны...

А готовый конечный запрос можно глянуть?


 
Виталий Панасенко(дом)   (2010-04-23 17:22) [10]

это я так понял, учет наружки? нет желания объединится?


 
снежок   (2010-04-23 21:47) [11]

Есть конечно стучись пять шесть девять 7 двадцать 5 шестьдесятдва)) у меня много наработок на эту тему и эта не последняя.



Страницы: 1 вся ветка

Текущий архив: 2012.02.12;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.009 c
3-1271666302
fearless
2010-04-19 12:38
2012.02.12
Получить список компьютеров, подключенных к конкретной БД


15-1319315405
Юрий
2011-10-23 00:30
2012.02.12
С днем рождения ! 23 октября 2011 воскресенье


15-1319444691
Фокс Йожин
2011-10-24 12:24
2012.02.12
Странные тормоза при загрузке Windows XP


15-1319498590
Kerk
2011-10-25 03:23
2012.02.12
Умер John McCarthy


15-1319617616
oldman
2011-10-26 12:26
2012.02.12
А вы когда картошку жарите-варите, вы ее чистите?