powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Оптимизация запроса (по мотивам моего же топика)
44 сообщений из 44, показаны все 2 страниц
Оптимизация запроса (по мотивам моего же топика)
    #32329724
Фотография фёдор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Задача\r
Есть таблица \r
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
CREATE TABLE RUSSIA (\r
    ID           INTEGER NOT NULL,\r
    FROM_TO      BOOL,\r
    BAG_DATE     DATE,\r
    BAG_NUMB     INTEGER,\r
    DESTINATION  INTEGER,\r
    BAG_WEIGHT   FLOAT,\r
    TARA         INTEGER\r
);
\r
здесь "DESTINATION" - FK на ID таблицы \r
Код: plaintext
1.
2.
3.
4.
CREATE TABLE TOWNS (\r
    ID                     INTEGER NOT NULL,\r
    NAME                VARCHAR( 100 ) CHARACTER SET WIN1251 COLLATE PXW_CYRL,\r
    DELIVERY_TYPE  INTEGER\r
);
\r
"DELIVERY_TYPE" - FK на ID таблицы \r
Код: plaintext
1.
2.
3.
CREATE TABLE DELIVERY_TYPES (\r
    ID               INTEGER NOT NULL,\r
    TYPE_NAME  VARCHAR( 100 ) CHARACTER SET WIN1251 COLLATE PXW_CYRL\r
);
\r
"TARA" - FK на ID таблицы\r
Код: plaintext
1.
2.
3.
CREATE TABLE BAG_TYPES (\r
    ID    INTEGER NOT NULL,\r
    NAME  VARCHAR( 30 ) CHARACTER SET WIN1251 COLLATE PXW_CYRL\r
); 
\r
Нужно написать запрос, который возвращает след. данные: \r
1 столбец - все значения поля "DELIVERY_TYPE.TYPE_NAME"\r
2 - COUNT(записей, у которых BAG_TYPES.NAME LIKE \'%ТАРА%\') \r
3 - SUM(по полю BAG_WEIGHT для записей, у которых BAG_TYPES.NAME LIKE \'%ТАРА%\' \r
4 - COUNT(записей, у которых BAG_TYPES.NAME LIKE \'%МЕШОК%\') \r
5 - SUM(по полю BAG_WEIGHT для записей, у которых BAG_TYPES.NAME LIKE \'%МЕШОК%\')\r
\r
Я решил так: создал 2 VIEW\r
\r
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
CREATE VIEW TARA(TTYPE, TCOUNT, TSUM)\r
AS\r
SELECT DELIVERY_TYPES.TYPE_NAME, COUNT( RUSSIA.BAG_WEIGHT ), SUM( RUSSIA.BAG_WEIGHT )\r
FROM BAG_TYPES\r
   RIGHT OUTER JOIN RUSSIA ON (BAG_TYPES.ID = RUSSIA.TARA)\r
   RIGHT OUTER JOIN TOWNS ON (RUSSIA.DESTINATION = TOWNS.ID)\r
   RIGHT OUTER JOIN DELIVERY_TYPES ON (TOWNS.DELIVERY_TYPE = DELIVERY_TYPES.ID)\r
WHERE (BAG_TYPES.NAME LIKE \'%ТАРА%\')\r
GROUP BY DELIVERY_TYPES.TYPE_NAME;\r
 \r
CREATE VIEW BAG(    BTYPE,    BCOUNT,    BSUM)\r
AS\r
SELECT DELIVERY_TYPES.TYPE_NAME, COUNT( RUSSIA.BAG_WEIGHT ), SUM( RUSSIA.BAG_WEIGHT )\r
FROM BAG_TYPES\r
   RIGHT OUTER JOIN RUSSIA ON (BAG_TYPES.ID = RUSSIA.TARA)\r
   RIGHT OUTER JOIN TOWNS ON (RUSSIA.DESTINATION = TOWNS.ID)\r
   RIGHT OUTER JOIN DELIVERY_TYPES ON (TOWNS.DELIVERY_TYPE = DELIVERY_TYPES.ID)\r
WHERE (BAG_TYPES.NAME LIKE \'%МЕШОК%\')\r
GROUP BY DELIVERY_TYPES.TYPE_NAME
;\r
И потом запрос\r
Код: plaintext
1.
2.
3.
4.
SELECT DELIVERY_TYPES.TYPE_NAME, BAG.BCOUNT, BAG.BSUM, TARA.TCOUNT, TARA.TSUM\r
FROM DELIVERY_TYPES\r
   LEFT OUTER JOIN TARA ON (DELIVERY_TYPES.TYPE_NAME = TARA.TTYPE)\r
   LEFT OUTER JOIN BAG ON (DELIVERY_TYPES.TYPE_NAME = BAG.BTYPE)\r
ORDER BY DELIVERY_TYPES.TYPE_NAME
\r
выдает нужные данные\r
Вопрос: Можно это упростить? Ведь VIEW не обновляются, и придется их все время новые создавать.
...
Рейтинг: 0 / 0
Оптимизация запроса (по мотивам моего же топика)
    #32329735
Фотография Dnico
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Федор
Ну а почему вместо всего вот этого не создать ХП и пользовать ее.
Это же намного эффективнее, чем два view + запрос.


Best regards,
Dnico.
...
Рейтинг: 0 / 0
Оптимизация запроса (по мотивам моего же топика)
    #32329759
Фотография фёдор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да Я сразу как топик написал, сразу об этом подумал, спасибо за поддержку.
Щас попробую
...
Рейтинг: 0 / 0
Оптимизация запроса (по мотивам моего же топика)
    #32329764
Фотография фёдор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Правда опыта большого в написании ХП нет, подскажите пож. для начала, все в одной ХП можно сделать, или 3 понадобятся?
...
Рейтинг: 0 / 0
Оптимизация запроса (по мотивам моего же топика)
    #32329796
Фотография Dnico
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВСЕ В ОДНОЙ !!! Там есть большие возможности :

Для примера открой базу EMPLOYEE и посмотри что и как ...
Она находится в директории \examples на сервере.

Best regards,
Dnico.
...
Рейтинг: 0 / 0
Оптимизация запроса (по мотивам моего же топика)
    #32329898
Фотография фёдор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Никак не догоню, как через 1 ХП сделать :-(
Мне ведь надо сделать SELECT 2-х других SELECTов?
...
Рейтинг: 0 / 0
Оптимизация запроса (по мотивам моего же топика)
    #32330001
Фотография Dnico
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЧЕРЕЗ КОНСТРУКЦИЮ

FOR SELECT ...


Best regards,
Dnico.
...
Рейтинг: 0 / 0
Оптимизация запроса (по мотивам моего же топика)
    #32330091
Фотография фёдор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если я правильно понимяю, FOR SELECT выдает данные порционно (построчно).
А мне же надо создать 2 набора данных (которые были в VIEW), а потом слить и их.
Это-то можно как-либо реализовать?

И еще, если можно, киньте пару-тройку ссылок почитать подробно про ХП с примерами
...
Рейтинг: 0 / 0
Оптимизация запроса (по мотивам моего же топика)
    #32330178
Фотография Dnico
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
http://www.ibase.ru/ib6.htm#doc

См. раздел Документация

Best regards,
Dnico.
...
Рейтинг: 0 / 0
Оптимизация запроса (по мотивам моего же топика)
    #32330301
Фотография KiLLun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так пример ХП для отчета
Код: 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.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
CREATE PROCEDURE REPORT_REESTR
RETURNS (
    DATAN INTEGER,
    DATA0 VARCHAR( 500 ),
    DATA1 VARCHAR( 500 ),
    DATA2 VARCHAR( 500 ),
    DATA3 VARCHAR( 500 ),
    DATA4 VARCHAR( 500 ),
    DATA5 VARCHAR( 500 ),
    DATA6 VARCHAR( 500 ),
    DATA7 VARCHAR( 500 ),
    DATA8 VARCHAR( 500 ),
    DATA9 VARCHAR( 500 ),
    DATA10 VARCHAR( 500 ),
    DATA11 VARCHAR( 500 ),
    DATA111 VARCHAR( 500 ),
    DATA12 VARCHAR( 500 ),
    DATA13 VARCHAR( 500 ),
    DATA14 VARCHAR( 500 ),
    DATA15 VARCHAR( 500 ),
    DATA16 VARCHAR( 500 ))
AS
DECLARE VARIABLE KARTIND INTEGER;
DECLARE VARIABLE PRILIND INTEGER;
declare variable dopInd integer;
DECLARE VARIABLE KARTDATE DATE;
declare variable datetmp1 date;
declare variable datetmp2 date;
DECLARE VARIABLE PRILDATE DATE;
DECLARE VARIABLE KARTISPARENT SMALLINT;
DECLARE VARIABLE TMPIND1 INTEGER;
DECLARE VARIABLE TMPIND2 INTEGER;
declare variable t2 integer;
declare variable t3 integer;
declare variable d1 varchar( 500 );
declare variable d2 varchar( 500 );
declare variable d3 varchar( 500 );
declare variable d4 varchar( 500 );
declare variable dd4 varchar( 500 );
declare variable d5 varchar( 500 );
declare variable d6 varchar( 500 );
declare variable d7 varchar( 500 );
declare variable d8 varchar( 500 );
declare variable d9 varchar( 500 );
declare variable d10 varchar( 500 );
declare variable n1 varchar( 500 );
declare variable n2 varchar( 500 );
declare variable n3 varchar( 500 );
declare variable n4 varchar( 500 );
declare variable n5 varchar( 500 );
declare variable n6 varchar( 500 );
declare variable n7 varchar( 500 );
declare variable n8 varchar( 500 );
declare variable n9 varchar( 500 );

begin
datan= 0 ;
for select IND from objects where TYPEIND= 25  and (objind is null) into :kartind
do begin
datan=datan+ 1 ;
select parentind from objects where ind=:kartind  into :t2;
select pval from get_one_param_value( 538 ,:kartind) into :data0;
select ival from pvalues where ind= 304  and objectind=:kartind into :data1;

select ival from pvalues where ind= 306  and objectind=:kartind into :data2;


select pval from get_one_param_value( 554 ,:t2) into :data3;

select pval from get_one_param_value( 234 ,:t2) into :data4;
 /* ??????????? ????? */ 
select pval from get_one_param_value( 237 ,:t2) into :d1;
select pval from get_one_param_value( 238 ,:t2) into :d2;
select pval from get_one_param_value( 239 ,:t2) into :d3;
select pval from get_one_param_value( 240 ,:t2) into :d4;
select pval from get_one_param_value( 241 ,:t2) into :d5;
select pval from get_one_param_value( 242 ,:t2) into :d6;
select pval from get_one_param_value( 243 ,:t2) into :d7;
select pval from get_one_param_value( 244 ,:t2) into :d8;
data5=d1||' '||d2||' '||d3||' '||d4||' '||d5||' '||d6||d7||' '||d8;
d1= 0 ; d2= 0 ; d3= 0 ; d4= 0 ; d5= 0 ; d6= 0 ; d7= 0 ; d8= 0 ;
 /* ?????  */ 
select pval from get_one_param_value( 246 ,:t2) into :d1;
select pval from get_one_param_value( 247 ,:t2) into :d2;
select pval from get_one_param_value( 248 ,:t2) into :d3;
select pval from get_one_param_value( 249 ,:t2) into :d4;
select pval from get_one_param_value( 250 ,:t2) into :d5;
select pval from get_one_param_value( 251 ,:t2) into :d6;
select pval from get_one_param_value( 252 ,:t2) into :d7;
select pval from get_one_param_value( 253 ,:t2) into :d8;
data6=d1||' '||d2||' '||d3||' '||d4||' '||d5||' '||d6||d7||' '||d8;
d1= 0 ; d2= 0 ; d3= 0 ; d4= 0 ; d5= 0 ; d6= 0 ; d7= 0 ; d8= 0 ;
select pval from get_one_param_value( 254 ,:t2) into :data7;
select pval from get_one_param_value( 255 ,:t2) into :data8;
 /* ?????? ? ??????????????? ???????????  */ 
select pval from get_one_param_value( 315 ,:t2) into :d1;
select pval from get_one_param_value( 258 ,:t2) into :d2;
select pval from get_one_param_value( 259 ,:t2) into :d3;
data9=d1||' '||d2||' '||d3;
 /* ?????????? ?????????  */ 
d1= 0 ; d2= 0 ; d3= 0 ; d4= 0 ; d5= 0 ; d6= 0 ; d7= 0 ; d8= 0 ;
select pval from get_one_param_value( 261 ,:t2) into :d1;
select pval from get_one_param_value( 262 ,:t2) into :d2;
select pval from get_one_param_value( 263 ,:t2) into :d3;
select pval from get_one_param_value( 264 ,:t2) into :d4;
select pval from get_one_param_value( 574 ,:t2) into :dd4;
data10=d1||' '||d2||' '||d3||' '||d4||' '||dd4;
d1= 0 ; d2= 0 ; d3= 0 ; d4= 0 ; d5= 0 ; d6= 0 ; d7= 0 ; d8= 0 ;

 /* to be continied..  */ 
data11='';
for select max(ind) from objects where parentind=:kartind and typeind= 28  into :prilind
do begin
select pval from get_one_param_value( 346 ,:prilind) into :data11;
end
data111='';
for select max(ind) from objects where parentind=:kartind and typeind= 27  into :prilind
do begin
select pval from get_one_param_value( 564 ,:prilind) into :data111;
end
data12='';
for select ind from objects where parentind=:kartind and typeind= 29  into :prilind
do begin
select pval from get_one_param_value( 561 ,:prilind) into :d9;
select pval from get_one_param_value( 364 ,:prilind) into :d10;
n1=d9||' '||d10;
data12=data12||' '||:n1;
end
data13='';
for select ind from objects where parentind=:kartind and typeind= 30  into :prilind
do begin
select pval from get_one_param_value( 560 ,:prilind) into :d9;
select pval from get_one_param_value( 559 ,:prilind) into :d10;
n1=d9||' '||d10;
data13=data13||' '||:n1;
end
data14='';
for select ind from objects where parentind=:kartind and typeind= 31  into :prilind
do begin
select pval from get_one_param_value( 562 ,:prilind) into :d9;
select pval from get_one_param_value( 401 ,:prilind) into :d10;
n1=d9||' '||d10;
data14=data14||' '||:n1;end
data15='';
for select ind from objects where parentind=:kartind and typeind= 32  into :prilind
do begin
select pval from get_one_param_value( 563 ,:prilind) into :d9;
select pval from get_one_param_value( 433 ,:prilind) into :d10;
n1=d9||' '||d10;
data15=data15||' '||:n1;
end




suspend;
end
end
...
Рейтинг: 0 / 0
Оптимизация запроса (по мотивам моего же топика)
    #32330323
Фотография Dnico
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KiLLun
ВАУ! Вот это пример !!!

Best regards,
Dnico.
...
Рейтинг: 0 / 0
Оптимизация запроса (по мотивам моего же топика)
    #32330355
Могун
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Могу опубликовать не менее впечатляющие тексты для ~5000 ХП ;)
...
Рейтинг: 0 / 0
Оптимизация запроса (по мотивам моего же топика)
    #32330628
Фотография KiLLun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не ну извините если че, я не хотел никому портить настроение.
И да вот еще что хотел бы увидеть пару процедур МОГУНа...
...
Рейтинг: 0 / 0
Оптимизация запроса (по мотивам моего же топика)
    #32330633
Фотография Johnmen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Ведь VIEW не обновляются, и придется их все время новые создавать.

Что это значит ???
...
Рейтинг: 0 / 0
Оптимизация запроса (по мотивам моего же топика)
    #32330722
Могун
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
CREATE PROCEDURE FILL_1C 
AS
DECLARE VARIABLE TOB_GR INTEGER;
DECLARE VARIABLE TOB_FL INTEGER;
DECLARE VARIABLE ATR2TOB INTEGER;

DECLARE VARIABLE KA INTEGER;
DECLARE VARIABLE FILIAL INTEGER;
DECLARE VARIABLE NAME VARCHAR( 60 );
DECLARE VARIABLE JNAME VARCHAR( 128 );
DECLARE VARIABLE JADRES VARCHAR( 85 );
DECLARE VARIABLE PADRES VARCHAR( 85 );
DECLARE VARIABLE PHONE VARCHAR( 50 );
DECLARE VARIABLE INN VARCHAR( 20 );

DECLARE VARIABLE GROUP_1C_JADRES INTEGER;
DECLARE VARIABLE GROUP_1C_INN INTEGER;
DECLARE VARIABLE GROUP_1C_PADRES INTEGER;
DECLARE VARIABLE GROUP_1C_PHONE INTEGER;
DECLARE VARIABLE GROUP_1C INTEGER;
BEGIN
  SELECT TOB.TOB FROM TOB
      WHERE TOB.KOD='GROUP_1C'
        AND NOT(TOB.A_TOB<> 0 ) AND NOT(TOB.DELETED<> 0 )
      INTO :TOB_GR;
  SELECT TOB.TOB FROM TOB
      WHERE TOB.KOD='FILIAL_1C'
        AND NOT(TOB.A_TOB<> 0 ) AND NOT(TOB.DELETED<> 0 )
      INTO :TOB_FL;
  DELETE FROM OB WHERE ((OB.TOB=:TOB_GR) OR (OB.TOB=:TOB_FL))
      AND ((OB.FULL_NAME IS NULL) OR (OB.FULL_NAME<>'UNGROUP'));

  FOR
    SELECT ATR2TOB.ATR2TOB FROM ATR2TOB
      WHERE ATR2TOB.KOD='GROUP_1C'
        AND NOT(ATR2TOB.A_ATR2TOB<> 0 ) AND NOT(ATR2TOB.DELETED<> 0 )
      INTO :ATR2TOB
  DO BEGIN
    UPDATE ATR2OB SET
      ATR2OB.VAL=''
      WHERE ATR2OB.ATR2TOB=:ATR2TOB
        AND NOT(ATR2OB.A_ATR2OB<> 0 ) AND NOT(ATR2OB.DELETED<> 0 );
    DELETE FROM ATR2OB
      WHERE ATR2OB.ATR2TOB=:ATR2TOB
        AND ATR2OB.A_ATR2OB<> 0 ;
    DELETE FROM ATR2OB
      WHERE ATR2OB.ATR2TOB=:ATR2TOB
        AND ATR2OB.DELETED<> 0 ;
  END

  SELECT ATR2TOB.ATR2TOB FROM ATR2TOB
      WHERE ATR2TOB.KOD='GROUP_1C.JADRES' AND ATR2TOB.TOB=:TOB_GR
        AND NOT(ATR2TOB.A_ATR2TOB<> 0 ) AND NOT(ATR2TOB.DELETED<> 0 )
      INTO :GROUP_1C_JADRES;
  SELECT ATR2TOB.ATR2TOB FROM ATR2TOB
      WHERE ATR2TOB.KOD='GROUP_1C.PADRES' AND ATR2TOB.TOB=:TOB_GR
        AND NOT(ATR2TOB.A_ATR2TOB<> 0 ) AND NOT(ATR2TOB.DELETED<> 0 )
      INTO :GROUP_1C_PADRES;
  SELECT ATR2TOB.ATR2TOB FROM ATR2TOB
      WHERE ATR2TOB.KOD='GROUP_1C.PHONE' AND ATR2TOB.TOB=:TOB_GR
        AND NOT(ATR2TOB.A_ATR2TOB<> 0 ) AND NOT(ATR2TOB.DELETED<> 0 )
      INTO :GROUP_1C_PHONE;
  SELECT ATR2TOB.ATR2TOB FROM ATR2TOB
      WHERE ATR2TOB.KOD='GROUP_1C.INN' AND ATR2TOB.TOB=:TOB_GR
        AND NOT(ATR2TOB.A_ATR2TOB<> 0 ) AND NOT(ATR2TOB.DELETED<> 0 )
      INTO :GROUP_1C_INN;

  FOR
    SELECT KA.KA, KA.NAME, KA.JNAME, KA.JADRES, KA.PADRES, KA.PHONE, KA.INN FROM KA
    INTO :KA, :NAME, :JNAME, :JADRES, :PADRES, :PHONE, :INN
  DO BEGIN
    INSERT INTO OB (OB, TOB, NAME, FULL_NAME)
      VALUES(:KA, :TOB_GR, :NAME, :JNAME);

    UPDATE ATR2OB SET
      ATR2OB.VAL=:JADRES
      WHERE ATR2OB.OB=:KA AND ATR2OB.ATR2TOB=:GROUP_1C_JADRES
        AND NOT(ATR2OB.A_ATR2OB<> 0 ) AND NOT(ATR2OB.DELETED<> 0 );
    UPDATE ATR2OB SET
      ATR2OB.VAL=:PADRES
      WHERE ATR2OB.OB=:KA AND ATR2OB.ATR2TOB=:GROUP_1C_PADRES
        AND NOT(ATR2OB.A_ATR2OB<> 0 ) AND NOT(ATR2OB.DELETED<> 0 );
    UPDATE ATR2OB SET
      ATR2OB.VAL=:PHONE
      WHERE ATR2OB.OB=:KA AND ATR2OB.ATR2TOB=:GROUP_1C_PHONE
        AND NOT(ATR2OB.A_ATR2OB<> 0 ) AND NOT(ATR2OB.DELETED<> 0 );
    UPDATE ATR2OB SET
      ATR2OB.VAL=:INN
      WHERE ATR2OB.OB=:KA AND ATR2OB.ATR2TOB=:GROUP_1C_INN
        AND NOT(ATR2OB.A_ATR2OB<> 0 ) AND NOT(ATR2OB.DELETED<> 0 );

    DELETE FROM ATR2OB WHERE ATR2OB.OB=:KA AND ((ATR2OB.A_ATR2OB<> 0 ) OR (ATR2OB.DELETED<> 0 ));
  END

  SELECT ATR2TOB.ATR2TOB FROM ATR2TOB
      WHERE ATR2TOB.KOD='GROUP_1C.PADRES' AND ATR2TOB.TOB=:TOB_FL
        AND NOT(ATR2TOB.A_ATR2TOB<> 0 ) AND NOT(ATR2TOB.DELETED<> 0 )
      INTO :GROUP_1C_PADRES;
  SELECT ATR2TOB.ATR2TOB FROM ATR2TOB
      WHERE ATR2TOB.KOD='GROUP_1C.PHONE' AND ATR2TOB.TOB=:TOB_FL
        AND NOT(ATR2TOB.A_ATR2TOB<> 0 ) AND NOT(ATR2TOB.DELETED<> 0 )
      INTO :GROUP_1C_PHONE;
  SELECT ATR2TOB.ATR2TOB FROM ATR2TOB
      WHERE ATR2TOB.KOD='GROUP_1C' AND ATR2TOB.TOB=:TOB_FL
        AND NOT(ATR2TOB.A_ATR2TOB<> 0 ) AND NOT(ATR2TOB.DELETED<> 0 )
      INTO :GROUP_1C;

  FOR
    SELECT FILIAL.FILIAL, FILIAL.KA, FILIAL.NAME, FILIAL.PADRES, FILIAL.PHONE FROM FILIAL
    INTO :FILIAL, :KA, :NAME, :PADRES, :PHONE
  DO BEGIN
    INSERT INTO OB (OB, TOB, NAME)
      VALUES(:FILIAL, :TOB_FL, :NAME);

    UPDATE ATR2OB SET
      ATR2OB.VAL=:PADRES
      WHERE ATR2OB.OB=:FILIAL AND ATR2OB.ATR2TOB=:GROUP_1C_PADRES
        AND NOT(ATR2OB.A_ATR2OB<> 0 ) AND NOT(ATR2OB.DELETED<> 0 );
    UPDATE ATR2OB SET
      ATR2OB.VAL=:PHONE
      WHERE ATR2OB.OB=:FILIAL AND ATR2OB.ATR2TOB=:GROUP_1C_PHONE
        AND NOT(ATR2OB.A_ATR2OB<> 0 ) AND NOT(ATR2OB.DELETED<> 0 );
    UPDATE ATR2OB SET
      ATR2OB.VAL=:KA
      WHERE ATR2OB.OB=:FILIAL AND ATR2OB.ATR2TOB=:GROUP_1C
        AND NOT(ATR2OB.A_ATR2OB<> 0 ) AND NOT(ATR2OB.DELETED<> 0 );

    DELETE FROM ATR2OB WHERE ATR2OB.OB=:FILIAL AND ((ATR2OB.A_ATR2OB<> 0 ) OR (ATR2OB.DELETED<> 0 ));
  END

  EXECUTE PROCEDURE ERASE_ALL_REPL;

  SELECT MAX(OB) FROM OB INTO :KA;
  SELECT GEN_ID(GEN_OB, :KA-GEN_ID(GEN_OB, 0 )) FROM RDB$DATABASE INTO :KA;
END
...
Рейтинг: 0 / 0
Оптимизация запроса (по мотивам моего же топика)
    #32330724
Могун
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
[SRC]CREATE PROCEDURE FILL_1C 
AS
DECLARE VARIABLE TOB_GR INTEGER;
DECLARE VARIABLE TOB_FL INTEGER;
DECLARE VARIABLE ATR2TOB INTEGER;

DECLARE VARIABLE KA INTEGER;
DECLARE VARIABLE FILIAL INTEGER;
DECLARE VARIABLE NAME VARCHAR( 60 );
DECLARE VARIABLE JNAME VARCHAR( 128 );
DECLARE VARIABLE JADRES VARCHAR( 85 );
DECLARE VARIABLE PADRES VARCHAR( 85 );
DECLARE VARIABLE PHONE VARCHAR( 50 );
DECLARE VARIABLE INN VARCHAR( 20 );

DECLARE VARIABLE GROUP_1C_JADRES INTEGER;
DECLARE VARIABLE GROUP_1C_INN INTEGER;
DECLARE VARIABLE GROUP_1C_PADRES INTEGER;
DECLARE VARIABLE GROUP_1C_PHONE INTEGER;
DECLARE VARIABLE GROUP_1C INTEGER;
BEGIN
  SELECT TOB.TOB FROM TOB
      WHERE TOB.KOD='GROUP_1C'
        AND NOT(TOB.A_TOB<> 0 ) AND NOT(TOB.DELETED<> 0 )
      INTO :TOB_GR;
  SELECT TOB.TOB FROM TOB
      WHERE TOB.KOD='FILIAL_1C'
        AND NOT(TOB.A_TOB<> 0 ) AND NOT(TOB.DELETED<> 0 )
      INTO :TOB_FL;
  DELETE FROM OB WHERE ((OB.TOB=:TOB_GR) OR (OB.TOB=:TOB_FL))
      AND ((OB.FULL_NAME IS NULL) OR (OB.FULL_NAME<>'UNGROUP'));

  FOR
    SELECT ATR2TOB.ATR2TOB FROM ATR2TOB
      WHERE ATR2TOB.KOD='GROUP_1C'
        AND NOT(ATR2TOB.A_ATR2TOB<> 0 ) AND NOT(ATR2TOB.DELETED<> 0 )
      INTO :ATR2TOB
  DO BEGIN
    UPDATE ATR2OB SET
      ATR2OB.VAL=''
      WHERE ATR2OB.ATR2TOB=:ATR2TOB
        AND NOT(ATR2OB.A_ATR2OB<> 0 ) AND NOT(ATR2OB.DELETED<> 0 );
    DELETE FROM ATR2OB
      WHERE ATR2OB.ATR2TOB=:ATR2TOB
        AND ATR2OB.A_ATR2OB<> 0 ;
    DELETE FROM ATR2OB
      WHERE ATR2OB.ATR2TOB=:ATR2TOB
        AND ATR2OB.DELETED<> 0 ;
  END

  SELECT ATR2TOB.ATR2TOB FROM ATR2TOB
      WHERE ATR2TOB.KOD='GROUP_1C.JADRES' AND ATR2TOB.TOB=:TOB_GR
        AND NOT(ATR2TOB.A_ATR2TOB<> 0 ) AND NOT(ATR2TOB.DELETED<> 0 )
      INTO :GROUP_1C_JADRES;
  SELECT ATR2TOB.ATR2TOB FROM ATR2TOB
      WHERE ATR2TOB.KOD='GROUP_1C.PADRES' AND ATR2TOB.TOB=:TOB_GR
        AND NOT(ATR2TOB.A_ATR2TOB<> 0 ) AND NOT(ATR2TOB.DELETED<> 0 )
      INTO :GROUP_1C_PADRES;
  SELECT ATR2TOB.ATR2TOB FROM ATR2TOB
      WHERE ATR2TOB.KOD='GROUP_1C.PHONE' AND ATR2TOB.TOB=:TOB_GR
        AND NOT(ATR2TOB.A_ATR2TOB<> 0 ) AND NOT(ATR2TOB.DELETED<> 0 )
      INTO :GROUP_1C_PHONE;
  SELECT ATR2TOB.ATR2TOB FROM ATR2TOB
      WHERE ATR2TOB.KOD='GROUP_1C.INN' AND ATR2TOB.TOB=:TOB_GR
        AND NOT(ATR2TOB.A_ATR2TOB<> 0 ) AND NOT(ATR2TOB.DELETED<> 0 )
      INTO :GROUP_1C_INN;

  FOR
    SELECT KA.KA, KA.NAME, KA.JNAME, KA.JADRES, KA.PADRES, KA.PHONE, KA.INN FROM KA
    INTO :KA, :NAME, :JNAME, :JADRES, :PADRES, :PHONE, :INN
  DO BEGIN
    INSERT INTO OB (OB, TOB, NAME, FULL_NAME)
      VALUES(:KA, :TOB_GR, :NAME, :JNAME);

    UPDATE ATR2OB SET
      ATR2OB.VAL=:JADRES
      WHERE ATR2OB.OB=:KA AND ATR2OB.ATR2TOB=:GROUP_1C_JADRES
        AND NOT(ATR2OB.A_ATR2OB<> 0 ) AND NOT(ATR2OB.DELETED<> 0 );
    UPDATE ATR2OB SET
      ATR2OB.VAL=:PADRES
      WHERE ATR2OB.OB=:KA AND ATR2OB.ATR2TOB=:GROUP_1C_PADRES
        AND NOT(ATR2OB.A_ATR2OB<> 0 ) AND NOT(ATR2OB.DELETED<> 0 );
    UPDATE ATR2OB SET
      ATR2OB.VAL=:PHONE
      WHERE ATR2OB.OB=:KA AND ATR2OB.ATR2TOB=:GROUP_1C_PHONE
        AND NOT(ATR2OB.A_ATR2OB<> 0 ) AND NOT(ATR2OB.DELETED<> 0 );
    UPDATE ATR2OB SET
      ATR2OB.VAL=:INN
      WHERE ATR2OB.OB=:KA AND ATR2OB.ATR2TOB=:GROUP_1C_INN
        AND NOT(ATR2OB.A_ATR2OB<> 0 ) AND NOT(ATR2OB.DELETED<> 0 );

    DELETE FROM ATR2OB WHERE ATR2OB.OB=:KA AND ((ATR2OB.A_ATR2OB<> 0 ) OR (ATR2OB.DELETED<> 0 ));
  END

  SELECT ATR2TOB.ATR2TOB FROM ATR2TOB
      WHERE ATR2TOB.KOD='GROUP_1C.PADRES' AND ATR2TOB.TOB=:TOB_FL
        AND NOT(ATR2TOB.A_ATR2TOB<> 0 ) AND NOT(ATR2TOB.DELETED<> 0 )
      INTO :GROUP_1C_PADRES;
  SELECT ATR2TOB.ATR2TOB FROM ATR2TOB
      WHERE ATR2TOB.KOD='GROUP_1C.PHONE' AND ATR2TOB.TOB=:TOB_FL
        AND NOT(ATR2TOB.A_ATR2TOB<> 0 ) AND NOT(ATR2TOB.DELETED<> 0 )
      INTO :GROUP_1C_PHONE;
  SELECT ATR2TOB.ATR2TOB FROM ATR2TOB
      WHERE ATR2TOB.KOD='GROUP_1C' AND ATR2TOB.TOB=:TOB_FL
        AND NOT(ATR2TOB.A_ATR2TOB<> 0 ) AND NOT(ATR2TOB.DELETED<> 0 )
      INTO :GROUP_1C;

  FOR
    SELECT FILIAL.FILIAL, FILIAL.KA, FILIAL.NAME, FILIAL.PADRES, FILIAL.PHONE FROM FILIAL
    INTO :FILIAL, :KA, :NAME, :PADRES, :PHONE
  DO BEGIN
    INSERT INTO OB (OB, TOB, NAME)
      VALUES(:FILIAL, :TOB_FL, :NAME);

    UPDATE ATR2OB SET
      ATR2OB.VAL=:PADRES
      WHERE ATR2OB.OB=:FILIAL AND ATR2OB.ATR2TOB=:GROUP_1C_PADRES
        AND NOT(ATR2OB.A_ATR2OB<> 0 ) AND NOT(ATR2OB.DELETED<> 0 );
    UPDATE ATR2OB SET
      ATR2OB.VAL=:PHONE
      WHERE ATR2OB.OB=:FILIAL AND ATR2OB.ATR2TOB=:GROUP_1C_PHONE
        AND NOT(ATR2OB.A_ATR2OB<> 0 ) AND NOT(ATR2OB.DELETED<> 0 );
    UPDATE ATR2OB SET
      ATR2OB.VAL=:KA
      WHERE ATR2OB.OB=:FILIAL AND ATR2OB.ATR2TOB=:GROUP_1C
        AND NOT(ATR2OB.A_ATR2OB<> 0 ) AND NOT(ATR2OB.DELETED<> 0 );

    DELETE FROM ATR2OB WHERE ATR2OB.OB=:FILIAL AND ((ATR2OB.A_ATR2OB<> 0 ) OR (ATR2OB.DELETED<> 0 ));
  END

  EXECUTE PROCEDURE ERASE_ALL_REPL;

  SELECT MAX(OB) FROM OB INTO :KA;
  SELECT GEN_ID(GEN_OB, :KA-GEN_ID(GEN_OB, 0 )) FROM RDB$DATABASE INTO :KA;
END
[/SRC]
...
Рейтинг: 0 / 0
Оптимизация запроса (по мотивам моего же топика)
    #32330729
Могун
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
CREATE PROCEDURE GET_VAL (
    AOB INTEGER,
    ATOB INTEGER,
    ATR01 VARCHAR ( 32 ),
    ATR02 VARCHAR ( 32 ),
    ATR03 VARCHAR ( 32 ))
RETURNS (
    VALZN VARCHAR ( 250 ))
AS
  DECLARE VARIABLE TOB INTEGER;
  DECLARE VARIABLE TOB_KOD VARCHAR( 20 );
  DECLARE VARIABLE OWNER INTEGER;
  DECLARE VARIABLE NAME VARCHAR( 60 );
  DECLARE VARIABLE FULL_NAME VARCHAR( 128 );
  DECLARE VARIABLE DESCRIPTION VARCHAR( 10000 );
  DECLARE VARIABLE KOD INTEGER;
  DECLARE VARIABLE ATR2TOB01 INTEGER;
  DECLARE VARIABLE VAL01 VARCHAR( 250 );
  DECLARE VARIABLE CNT INTEGER;
BEGIN
  VALZN='';
  VAL01=NULL;
  ATR03=TRIMCHAR(UPCASE(ATR03));
  IF (AOB IS NOT NULL) THEN BEGIN
    IF (ATOB IS NULL) THEN
      SELECT OB.TOB FROM OB OB WHERE OB.OB=:AOB AND NOT(OB.A_OB<> 0 ) AND NOT(OB.DELETED<> 0 )
      INTO :TOB;
    ELSE
      TOB=ATOB;
    IF ((TOB IS NOT NULL) AND (ATR01 IS NOT NULL)) THEN BEGIN
      ATR01=TRIMCHAR(UPCASE(ATR01));
      SELECT A.ATR2TOB FROM ATR2TOB A WHERE A.TOB=:TOB AND A.KOD LIKE :ATR01 AND NOT(A.A_ATR2TOB<> 0 ) AND NOT(A.DELETED<> 0 )
      INTO :ATR2TOB01;
      IF (ATR2TOB01 IS NOT NULL) THEN BEGIN
        SELECT A.VAL FROM ATR2OB A WHERE A.OB=:AOB AND A.ATR2TOB=:ATR2TOB01 AND NOT(A.A_ATR2OB<> 0 ) AND NOT(A.DELETED<> 0 )
        INTO :VAL01;
        IF (ATR02 IS NOT NULL) THEN BEGIN
          ATR02=TRIMCHAR(UPCASE(ATR02));
          SELECT OB.OB, OB.TOB FROM OB OB
          WHERE OB.OB=CAST(:VAL01 AS INTEGER) AND NOT(OB.A_OB<> 0 ) AND NOT(OB.DELETED<> 0 )
          INTO :AOB, :TOB;
          SELECT A.ATR2TOB FROM ATR2TOB A WHERE A.TOB=:TOB AND A.KOD LIKE :ATR02 AND NOT(A.A_ATR2TOB<> 0 ) AND NOT(A.DELETED<> 0 )
          INTO :ATR2TOB01;
          IF (ATR2TOB01 IS NOT NULL) THEN BEGIN
            SELECT A.VAL FROM ATR2OB A WHERE A.OB=:AOB AND A.ATR2TOB=:ATR2TOB01 AND NOT(A.A_ATR2OB<> 0 ) AND NOT(A.DELETED<> 0 )
            INTO :VAL01;
          END
        END
      END
    END
    IF (ATR03='OB') THEN
      VALZN=VAL01;
    ELSE BEGIN
      IF (VAL01 IS NULL) THEN
        VAL01=AOB;
      AOB=CAST(VAL01 AS INTEGER);
      SELECT OB.TOB, OB.OWNER, OB.NAME, OB.FULL_NAME, OB.DESCRIPTION, OB.KOD FROM OB OB
      WHERE OB.OB=CAST(:VAL01 AS INTEGER) AND NOT(OB.A_OB<> 0 ) AND NOT(OB.DELETED<> 0 )
      INTO :TOB, :OWNER, :NAME, :FULL_NAME, :DESCRIPTION, :KOD;
      IF (ATR03='TOB') THEN VALZN=TOB;
      IF (ATR03='OWNER') THEN VALZN=OWNER;
      IF (ATR03='NAME') THEN VALZN=NAME;
      IF (ATR03='FULL_NAME') THEN VALZN=FULL_NAME;
      IF (ATR03='DESCRIPTION') THEN VALZN=DESCRIPTION;
      IF (ATR03='KOD') THEN VALZN=KOD;
      IF (ATR03='ATR2TOB') THEN VALZN=ATR2TOB01;
      WHEN ANY DO BEGIN
        VAL01=:AOB;
        AOB=CAST(VAL01 AS INTEGER);
        SELECT OB.TOB, OB.OWNER, OB.NAME, OB.FULL_NAME, OB.DESCRIPTION, OB.KOD FROM OB OB
        WHERE OB.OB=CAST(:VAL01 AS INTEGER) AND NOT(OB.A_OB<> 0 ) AND NOT(OB.DELETED<> 0 )
        INTO :TOB, :OWNER, :NAME, :FULL_NAME, :DESCRIPTION, :KOD;
        IF (ATR03='TOB') THEN VALZN=TOB;
        IF (ATR03='OWNER') THEN VALZN=OWNER;
        IF (ATR03='NAME') THEN VALZN=NAME;
        IF (ATR03='FULL_NAME') THEN VALZN=FULL_NAME;
        IF (ATR03='DESCRIPTION') THEN VALZN=DESCRIPTION;
        IF (ATR03='KOD') THEN VALZN=KOD;
        IF (ATR03='ATR2TOB') THEN VALZN=ATR2TOB01;
      END
    END
  END
  IF (AOB IS NULL) THEN BEGIN
    IF ((ATOB IS NULL) AND (ATR01 IS NOT NULL)) THEN BEGIN
      ATR01=TRIMCHAR(UPCASE(ATR01));
      SELECT TOB.TOB, TOB.KOD FROM TOB
      WHERE TRIMCHAR(UPCASE(TOB.KOD))=:ATR01
      AND NOT(TOB.A_TOB<> 0 ) AND NOT(TOB.DELETED<> 0 )
      INTO :TOB, :TOB_KOD;
      IF (ATR02 IS NOT NULL) THEN BEGIN
        ATR02=TRIMCHAR(UPCASE(ATR02));
        SELECT ATR2TOB.ATR2TOB FROM ATR2TOB
        WHERE ATR2TOB.TOB=:TOB AND TRIMCHAR(UPCASE(ATR2TOB.KOD))=:ATR02
        AND NOT(ATR2TOB.A_ATR2TOB<> 0 ) AND NOT(ATR2TOB.DELETED<> 0 )
        INTO :ATR2TOB01;
        IF (ATR03='ATR2TOB') THEN VALZN=ATR2TOB01;
      END
      ELSE BEGIN
      IF (ATR03='TOB') THEN VALZN=TOB;
      IF (ATR03='KOD') THEN VALZN=TOB_KOD;
      END
    END
    IF ((ATOB IS NOT NULL) AND (ATR01 IS NULL)) THEN BEGIN
      SELECT TOB.KOD FROM TOB
      WHERE TOB.TOB=:ATOB
      AND NOT(TOB.A_TOB<> 0 ) AND NOT(TOB.DELETED<> 0 )
      INTO :TOB_KOD;
      IF (ATR03='KOD') THEN VALZN=TOB_KOD;
    END
  END
  SUSPEND;
END
...
Рейтинг: 0 / 0
Оптимизация запроса (по мотивам моего же топика)
    #32330994
Фотография фёдор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо конечено за примеры (хотя это похоже на то как двое членами меряются,... sorry за грубость, но не удержался), но все-таки на мой вопрос кто-нить сможет ответить.
Я писал:Если я правильно понимяю, FOR SELECT выдает данные порционно (построчно).
А мне же надо создать 2 набора данных (которые были в VIEW), а потом слить и их.
Это-то можно как-либо реализовать в ХП?

Johnmen писал:>Ведь VIEW не обновляются, и придется их все время новые создавать.

Что это значит ???
Понял. Осознал, что я глупость написал
...
Рейтинг: 0 / 0
Оптимизация запроса (по мотивам моего же топика)
    #32331038
Могун
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Эт` точно. Но ведь "в попугаях я гораздо длиннее" (удав).
...
Рейтинг: 0 / 0
Оптимизация запроса (по мотивам моего же топика)
    #32331042
Фотография Dnico
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот и сливай построчно !!!


Best regards,
Dnico.
...
Рейтинг: 0 / 0
Оптимизация запроса (по мотивам моего же топика)
    #32331446
Фотография фёдор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Но я же не могу задать в ХП набор данных? Или могу?
Потому что (как у меня было раньше) к началу работы
Код: plaintext
1.
2.
3.
4.
SELECT DELIVERY_TYPES.TYPE_NAME, BAG.BCOUNT, BAG.BSUM, TARA.TCOUNT, TARA.TSUM
FROM DELIVERY_TYPES
   LEFT OUTER JOIN TARA ON (DELIVERY_TYPES.TYPE_NAME = TARA.TTYPE)
   LEFT OUTER JOIN BAG ON (DELIVERY_TYPES.TYPE_NAME = BAG.BTYPE)
ORDER BY DELIVERY_TYPES.TYPE_NAME

уже должны быть созданы
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
CREATE VIEW TARA(TTYPE, TCOUNT, TSUM)
AS
SELECT DELIVERY_TYPES.TYPE_NAME, COUNT( RUSSIA.BAG_WEIGHT ), SUM( RUSSIA.BAG_WEIGHT )
FROM BAG_TYPES
   RIGHT OUTER JOIN RUSSIA ON (BAG_TYPES.ID = RUSSIA.TARA)
   RIGHT OUTER JOIN TOWNS ON (RUSSIA.DESTINATION = TOWNS.ID)
   RIGHT OUTER JOIN DELIVERY_TYPES ON (TOWNS.DELIVERY_TYPE = DELIVERY_TYPES.ID)
WHERE (BAG_TYPES.NAME LIKE '%ТАРА%')
GROUP BY DELIVERY_TYPES.TYPE_NAME

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
CREATE VIEW BAG(    BTYPE,    BCOUNT,    BSUM)
AS
SELECT DELIVERY_TYPES.TYPE_NAME, COUNT( RUSSIA.BAG_WEIGHT ), SUM( RUSSIA.BAG_WEIGHT )
FROM BAG_TYPES
   RIGHT OUTER JOIN RUSSIA ON (BAG_TYPES.ID = RUSSIA.TARA)
   RIGHT OUTER JOIN TOWNS ON (RUSSIA.DESTINATION = TOWNS.ID)
   RIGHT OUTER JOIN DELIVERY_TYPES ON (TOWNS.DELIVERY_TYPE = DELIVERY_TYPES.ID)
WHERE (BAG_TYPES.NAME LIKE '%МЕШОК%')
GROUP BY DELIVERY_TYPES.TYPE_NAME

иначе как тогда обратится к наборам данных, кот. у меня в VIEW? Так я пишу, например TARA.TTYPE, а как я сделаю подобное в ХП?

Dnico писал:Вот и сливай построчно !!!
Вот как раз чтобы сливать построчно, надо иметь что сливать. Но если делать все в ОДНОЙ ХП, то как изначально получить те наборы данных, что у меня в VIEW?
...
Рейтинг: 0 / 0
Оптимизация запроса (по мотивам моего же топика)
    #32332572
Фотография фёдор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вроде все сделал.
Если можно, еще один вопросик.
А эту мою задачу (выборку сделать), поставленную в самом начале, можно одним SELECTом решить???
...
Рейтинг: 0 / 0
Оптимизация запроса (по мотивам моего же топика)
    #32332606
Berg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно.

P.S. :-)
...
Рейтинг: 0 / 0
Оптимизация запроса (по мотивам моего же топика)
    #32332655
Berg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1) Напиши аналог функции CAST (а может он уже есть в IB);
2)
Первое что приходит в голову:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
SELECT COUNT(CASE WHEN BAG_TYPES.NAME LIKE '%ТАРА%' THEN  1  ELSE  0  END),
  SUM(CASE WHEN BAG_TYPES.NAME LIKE '%ТАРА%' THEN BAG_WEIGHT ELSE  0  END),
  COUNT(CASE WHEN BAG_TYPES.NAME LIKE '%МЕШОК%' THEN  1  ELSE  0  END),
  SUM(CASE WHEN BAG_TYPES.NAME LIKE '%МЕШОК%' THEN BAG_WEIGHT ELSE  0  END)
FROM RUSSIA
JOIN TOWNS ...
JOIN DELIVERY_TYPE ...
JOIN TARA ...

Можно пооптимизировать...

А вообще естественным для такой задачи выглядит что-нить типа:
Код: plaintext
1.
2.
3.
SELECT COUNT(*), SUM(BAG_WEIGHT)
FROM RUSSIA
GROUP BY TARA

Только внимательно надо отнестись тут к NULL полям...
Разве это не то?

P.S.

CASE
Evaluates a list of conditions and returns one of multiple possible result expressions.

CASE has two formats:
The simple CASE function compares an expression to a set of simple expressions to determine the result.

The searched CASE function evaluates a set of Boolean expressions to determine the result.
Both formats support an optional ELSE argument.

Syntax
Simple CASE function:

CASE input_expression
WHEN when_expression THEN result_expression
[ ...n ]
[
ELSE else_result_expression
]
END

Searched CASE function:

CASE
WHEN Boolean_expression THEN result_expression
[ ...n ]
[
ELSE else_result_expression
]
END
...
Рейтинг: 0 / 0
Оптимизация запроса (по мотивам моего же топика)
    #32332900
Фотография фёдор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вопрос к гуру IB: в IB есть аналог CASE?
...
Рейтинг: 0 / 0
Оптимизация запроса (по мотивам моего же топика)
    #32332902
Фотография Dnico
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И CAST и CASE все это уже есть. CASE - появилась в FB 1.5.

Best regards,
Dnico.
...
Рейтинг: 0 / 0
Оптимизация запроса (по мотивам моего же топика)
    #32332923
Фотография фёдор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А в IB 6.5 CASE есть?
...
Рейтинг: 0 / 0
Оптимизация запроса (по мотивам моего же топика)
    #32332978
Фотография Dnico
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
нет (скорее всего).

Best regards,
Dnico.
...
Рейтинг: 0 / 0
Оптимизация запроса (по мотивам моего же топика)
    #32333171
Berg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А замутить CASE через UDF в IB не как два пальца?

Вывод:
Пора переходить на FB...:-)

P.S.
Пардон, CAST - это я совсем не в тему...
...
Рейтинг: 0 / 0
Оптимизация запроса (по мотивам моего же топика)
    #32333179
Фотография фёдор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да я замутил, тока ошибку
Код: plaintext
1.
2.
3.
Invalid token.
invalid request BLR at offset  59 .
function IB_CASE is not defined.
module name or entrypoint could not be found.

выдает.
Причем при вызове из дельфи работает корректно, а как UDF в IB не работает.
Никто не знает из-за чего может это быть
...
Рейтинг: 0 / 0
Оптимизация запроса (по мотивам моего же топика)
    #32333273
Фотография Dnico
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так функцию нужно еще и определить в базе (примерно вот так):

Код: plaintext
1.
2.
3.
4.
5.
6.
DECLARE EXTERNAL FUNCTION SUBSTR
    CSTRING( 80 ),
    SMALLINT,
    SMALLINT
RETURNS CSTRING( 80 ) FREE_IT
ENTRY_POINT 'IB_UDF_substr' MODULE_NAME 'ib_udf'


Best regards,
Dnico.
...
Рейтинг: 0 / 0
Оптимизация запроса (по мотивам моего же топика)
    #32333290
Фотография фёдор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Короче у меня так
Код: plaintext
1.
2.
3.
4.
5.
6.
DECLARE EXTERNAL FUNCTION CASE
    CSTRING( 30 ),
    CSTRING( 30 ),
    DOUBLE PRECISION,
    DOUBLE PRECISION
RETURNS DOUBLE PRECISION BY VALUE
ENTRY_POINT 'IB_CASE' MODULE_NAME 'ib_dll'

ну а DLL
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
library ib_dll;
uses
  SysUtils,
  Classes;
{$R *.res}
function IB_CASE(MainStr, LikeStr: PChar; OK, NotOK: double): double; cdecl; {export; }
begin
  if pos(String(LikeStr),String(MainStr))> 0  then Result:=double(OK)
  else Result:=double(NotOK);
end;
exports
  IB_CASE;
begin
end.
...
Рейтинг: 0 / 0
Оптимизация запроса (по мотивам моего же топика)
    #32333307
Фотография фёдор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А кстати, DLL где должна лежать относительно *.GDB?
...
Рейтинг: 0 / 0
Оптимизация запроса (по мотивам моего же топика)
    #32333369
Фотография Dnico
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На сервере есть папка UDF. Там и должно это быть.
Best regards,
Dnico.
...
Рейтинг: 0 / 0
Оптимизация запроса (по мотивам моего же топика)
    #32333428
Фотография фёдор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И нихрена оно не работает
Код: plaintext
1.
SELECT CASE( BAG_TYPES.NAME, 'А',  1 . 2 ,  4 . 5  ) CASE_OF_NAME
FROM BAG_TYPES

(в BAG_TYPES - 4 записи)
выдает
0.0
0.0
0.0
0.0
...
Рейтинг: 0 / 0
Оптимизация запроса (по мотивам моего же топика)
    #32333451
Фотография Dnico
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
{export; } ??? А почему вот это ?

Должно быть : cdecl; export;

Best regards,
Dnico.
...
Рейтинг: 0 / 0
Оптимизация запроса (по мотивам моего же топика)
    #32333456
Могун
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть мнение, что кривые руки мешают задавать адекватные вопросы...
Воинствующее невежество+Интернет=Страшная сила
...
Рейтинг: 0 / 0
Оптимизация запроса (по мотивам моего же топика)
    #32333458
Могун
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нам тут раздают ЗАДАЧИ, что само по себе странно. Скромнее надо быть.
...
Рейтинг: 0 / 0
Оптимизация запроса (по мотивам моего же топика)
    #32333461
Фотография фёдор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ничего не понимаю
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
CREATE PROCEDURE NEW_PROCEDURE (
    A VARCHAR( 10 ) CHARACTER SET WIN1251,
    S VARCHAR( 10 ) CHARACTER SET WIN1251)
RETURNS (
    D INTEGER)
AS
begin
  D=case(:A,:S,  11 ,  1 );
  suspend;
end

при A=qwer; S=q;
D=0.0 ?????????
Почему???
Кто-нить знает???
...
Рейтинг: 0 / 0
Оптимизация запроса (по мотивам моего же топика)
    #32333492
Фотография Dnico
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я бы еще добавил const
Код: plaintext
1.
function IB_CASE(const MainStr, LikeStr: PChar; const OK, NotOK: double): double; cdecl; export;

Best regards,
Dnico.
...
Рейтинг: 0 / 0
Оптимизация запроса (по мотивам моего же топика)
    #32333496
Фотография фёдор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Могун:
Лично ВАМ никто задания не раздает. Но если Вам так кажется, то Вас никто не заставляет их решать.
Да, я еще плохо (может очень плохо) разбираюсь в IB.
И просто прошу помочь. Причем не помочь решить, а подсказать, что может быть не так.
У Вас, что с первого раза все получилось и стало работать?

Dnico писал:Должно быть : cdecl; export;
Дело в том, что у меня сначла так и было, но результат как был нулевым, так им и остался.
Все равно, спасибо за помощь.
...
Рейтинг: 0 / 0
Оптимизация запроса (по мотивам моего же топика)
    #32333512
Могун
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Федор, я могу иметь своё мнение, а оно таково:
Вы воинствующе себя ведете и не работаете над ответами, которые дает аудитория, а я таких людей не уважаю, что и довожу до Вашего сведения.
Сама семантика сообщения, которое говорит о ЗАДАЧЕ, тому подтверждение.
...
Рейтинг: 0 / 0
Оптимизация запроса (по мотивам моего же топика)
    #32333547
Фотография фёдор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо всем за помощь.
Не буду с CASE мутить, что-то не работает никак.
Пусть будет, как и было: через 2 ХП
...
Рейтинг: 0 / 0
Оптимизация запроса (по мотивам моего же топика)
    #32334212
Фотография KiLLun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может быть Федор уже не увидит это, но мое мнение не так уж и страшно поменять IB 6.5 на FB 1.5 (если дело в CASE)

(там механизм CASE отработан на 100 %)
...
Рейтинг: 0 / 0
44 сообщений из 44, показаны все 2 страниц
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Оптимизация запроса (по мотивам моего же топика)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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