powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Оптимальный запрос к двум таблицам - FB1.5
24 сообщений из 24, страница 1 из 1
Оптимальный запрос к двум таблицам - FB1.5
    #40055115
EvgErmak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть 2 таблицы

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
KATMC (Каталог Материальных ценностей)
---
ID (идентификатор)
ID_MC (идентификатор МЦ)
ID_GR (идентификатор Группы)

дополнительный индекс по ID_GR

PRIHOD (Приход)
---
ID (идентификатор)
ID_MC (идентификатор МЦ)
KOL (Количество)

дополнительный индекс по ID_MC



Запрос на суммирование по необходимой нам группе
Код: sql
1.
select sum(kol)  from prihod, katmc where Идентификатор_группы = katmc.id_gr and prihod.id_mc = katmc.id



Оптимальный ли запрос?
...
Рейтинг: 0 / 0
Оптимальный запрос к двум таблицам - FB1.5
    #40055152
AltHasp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
EvgErmak,

Если у вас поля проиндексированные, то запрос норм. Еще можно хранить агрегаты по количеству.
А какая задача у вас?

Удачи !
...
Рейтинг: 0 / 0
Оптимальный запрос к двум таблицам - FB1.5
    #40055169
EvgErmak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AltHasp

Мне надо просуммировать по группам
индексы стоят
...
Рейтинг: 0 / 0
Оптимальный запрос к двум таблицам - FB1.5
    #40055172
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
19.03.2021 11:24, EvgErmak пишет:
> Мне надо просуммировать по группам

начни с азбуки SQL.
надо по группам - группируй.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Оптимальный запрос к двум таблицам - FB1.5
    #40055176
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
EvgErmakОптимальный ли запрос?
нет понятия "оптимальный запрос" для SQL. Что напишете, то и сделает.
Другой вопрос - есть-ли индексы, сколько записей в таблицах, сколько времени выполняется запрос,
и сколько вы "хотели бы".
Так что нужно смотреть план запроса, и т.д.
...
Рейтинг: 0 / 0
Оптимальный запрос к двум таблицам - FB1.5
    #40055181
EvgErmak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdv

Спасибо, а план у меня такой
Код: sql
1.
PLAN JOIN (KATMC INDEX (KATMC_IDX1),PRIHOD INDEX (PRIHOD_IDX1))
...
Рейтинг: 0 / 0
Оптимальный запрос к двум таблицам - FB1.5
    #40055185
AltHasp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
EvgErmakМне надо просуммировать по группам

Ну тогда вам нужно что-такое
Код: plsql
1.
2.
3.
select gruppa_id,sum(kol_vo) 
from my_table 
group by 1,2



Или можете создать представление (view) и селектить уже по ней.

Удачи !
...
Рейтинг: 0 / 0
Оптимальный запрос к двум таблицам - FB1.5
    #40055187
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
19.03.2021 12:05, AltHasp пишет:
> group by 1,2

да?!
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Оптимальный запрос к двум таблицам - FB1.5
    #40055225
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
EvgErmakплан у меня такой

Подозрительный план. Ты индексы для ограничений руками что ли создавал?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Оптимальный запрос к двум таблицам - FB1.5
    #40055318
KreatorXXI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

ТС что-то не договаривает. Реально DDL не совпадает с планом. Наоборот - план не совпадает с DDL.

EvgErmak, покажите DDL.
...
Рейтинг: 0 / 0
Оптимальный запрос к двум таблицам - FB1.5
    #40055319
Фотография Старый плюшевый мишка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

Подозрительный план.


Для начала - подозрительный запрос я имею в виду, глядючи на

KATMC (Каталог Материальных ценностей)
---
ID (идентификатор)
ID_MC (идентификатор МЦ)

и

and prihod.id_mc = katmc. id


Можно, конечно, списать на безалаберность при изобретении наименований. А о ссылочной целостности в РСУБД автор явно не, не слышал. Такшта тут с консерватории надо начинать, а не с запросов-индексов.
...
Рейтинг: 0 / 0
Оптимальный запрос к двум таблицам - FB1.5
    #40055325
EvgErmak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
таблицу катмс набирал руками проглядел
конечно же
Код: sql
1.
2.
3.
4.
KATMC (Каталог Материальных ценностей)
---
ID (идентификатор)
ID_GR (идентификатор Группы)



а чего не так со связкой

and prihod.id_mc = katmc.id
...
Рейтинг: 0 / 0
Оптимальный запрос к двум таблицам - FB1.5
    #40055336
EvgErmak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DDL
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
CREATE TABLE KATMC (
    ID          BIGINT NOT NULL,
    ID_GR_NORM  BIGINT); /*группа*/

ALTER TABLE KATMC ADD CONSTRAINT PK_KATMC PRIMARY KEY (ID);
CREATE INDEX KATMC_IDX1 ON KATMC (ID_GR_NORM);


CREATE TABLE PRIHOD (
    ID     BIGINT NOT NULL,
    ID_MC  BIGINT,   /*ID МЦ*/
    KOL    D_KOL );  /*количество */ 
ALTER TABLE PRIHOD ADD CONSTRAINT PK_PRIHOD PRIMARY KEY (ID);
CREATE INDEX PRIHOD_IDX1 ON PRIHOD (ID_MC);
...
Рейтинг: 0 / 0
Оптимальный запрос к двум таблицам - FB1.5
    #40055337
Фотография Старый плюшевый мишка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
EvgErmak
таблицу катмс набирал руками проглядел
конечно же
Код: sql
1.
2.
3.
4.
KATMC (Каталог Материальных ценностей)
---
ID (идентификатор)
ID_GR (идентификатор Группы)



а чего не так со связкой

and prihod.id_mc = katmc.id


С учётом "конечно же" - со связкой никаких проблем. Без "конечно же" у опытного человека срабатывает рефлекс, говорящий ему что под понятием "id материальной ценности" скрывается некий класс позиций каталога, на который почему-то ссылаются обе таблицы, а прямой связи между ними нет.
...
Рейтинг: 0 / 0
Оптимальный запрос к двум таблицам - FB1.5
    #40055340
Фотография Старый плюшевый мишка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
EvgErmak
DDL
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
CREATE TABLE KATMC (
    ID          BIGINT NOT NULL,
    ID_GR_NORM  BIGINT); /*группа*/

ALTER TABLE KATMC ADD CONSTRAINT PK_KATMC PRIMARY KEY (ID);
CREATE INDEX KATMC_IDX1 ON KATMC (ID_GR_NORM);


CREATE TABLE PRIHOD (
    ID     BIGINT NOT NULL,
    ID_MC  BIGINT,   /*ID МЦ*/
    KOL    D_KOL );  /*количество */ 
ALTER TABLE PRIHOD ADD CONSTRAINT PK_PRIHOD PRIMARY KEY (ID);
CREATE INDEX PRIHOD_IDX1 ON PRIHOD (ID_MC);




По уму должно быть
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
CREATE TABLE MC_GROUPS (
ID BIGINT,
/*Наименование и прочие атрибуты группы*/
ALTER TABLE MC_GROUPS ADD CONSTRAINT PK_MCGR PRIMARY KEY (ID)

CREATE TABLE KATMC (
    ID          BIGINT NOT NULL,
    ID_GR_NORM  BIGINT); /*группа*/

ALTER TABLE KATMC ADD CONSTRAINT PK_KATMC PRIMARY KEY (ID);
ALTER TABLE KATMC ADD CONSTRAINT FK_KATMC_GR FOREIGN KEY (ID_GR_NORM) REFERENCES MC_GROUPS (ID);

CREATE TABLE PRIHOD (
    ID     BIGINT NOT NULL,
    ID_MC  BIGINT,   /*ID МЦ*/
    KOL    D_KOL );  /*количество */ 
ALTER TABLE PRIHOD ADD CONSTRAINT PK_PRIHOD PRIMARY KEY (ID);
ALTER TABLE PRIHOD ADD CONSTRAINT FK_PRIHOD_KATMC FOREIGN KEY (ID_MC) REFERENCES KATMC (ID);



Кроме того, что нужные индексы создадутся автоматически, оно ещё избавит от массы проблем в будущем.
...
Рейтинг: 0 / 0
Оптимальный запрос к двум таблицам - FB1.5
    #40055343
KreatorXXI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
EvgErmak,

переделайте как Мишка говорит. И запрос через join напишите.
...
Рейтинг: 0 / 0
Оптимальный запрос к двум таблицам - FB1.5
    #40055346
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KreatorXXI,

в топике ФБ 1.5. Понятно что это не 1.0, но всё-таки...
...
Рейтинг: 0 / 0
Оптимальный запрос к двум таблицам - FB1.5
    #40055352
Фотография Старый плюшевый мишка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdv

в топике ФБ 1.5.


https://www.youtube.com/watch?v=FFydUyq4uhE
...
Рейтинг: 0 / 0
Оптимальный запрос к двум таблицам - FB1.5
    #40055360
Фотография Старый плюшевый мишка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KreatorXXI
EvgErmak,

переделайте как Мишка говорит.


На самом деле с точки зрения абстрактной эрудиции :) это тоже топорненько. Учебный пример, тксзать. В реальной жизни каталог ценностей (скажем, товаров) ведёт один человек, владеющий вопросами атрибутики этих товаров, и вхождение этих товаров в группы, (скажем, ценовые) не его собачье дело. В эти группы их уже после регистрации включает другой человек, владеющий вопросами маркетинга и ценообразования. То есть, тут должна быть ещё таблица m:n. А если вспомнить про первый сорт, второй, и третий, который не брак патамушта его тоже ещё можно втюхать с хорошей скидкой...
...
Рейтинг: 0 / 0
Оптимальный запрос к двум таблицам - FB1.5
    #40055362
EvgErmak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KreatorXXI
EvgErmak,

переделайте как Мишка говорит. И запрос через join напишите.


Буду благодарен если с join запрос покажете
...
Рейтинг: 0 / 0
Оптимальный запрос к двум таблицам - FB1.5
    #40055364
KreatorXXI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdv
KreatorXXI,

в топике ФБ 1.5. Понятно что это не 1.0, но всё-таки...


не понял. Что, джойны не поддерживает?
...
Рейтинг: 0 / 0
Оптимальный запрос к двум таблицам - FB1.5
    #40055369
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KreatorXXI,

нет, оптимизатор кривоват.
...
Рейтинг: 0 / 0
Оптимальный запрос к двум таблицам - FB1.5
    #40055472
KreatorXXI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdv,

ну тогда ладно. Запрос в принципе прост. EvgErmak, типа такого:
Код: sql
1.
2.
3.
4.
select sum(a.kol)
from prihod a
        join katmc b on b.id=a.id_mc
where b.id_gr=Идентификатор_группы


Если надо по всем группам сразу, то так:
Код: sql
1.
2.
3.
4.
5.
select b.id_gr, sum(a.kol)
from prihod a
        join katmc b on b.id=a.id_mc
--where b.id_gr=Идентификатор_группы
group by 1


Или ещё таблицу групп подцепить:
Код: sql
1.
2.
3.
4.
5.
6.
select c.id_gr, c.name, sum(a.kol)
from prihod a
        join katmc b on b.id=a.id_mc
        join groups c on c.id=b.id_gr
--where b.id_gr=Идентификатор_группы
group by 1, 2
...
Рейтинг: 0 / 0
Оптимальный запрос к двум таблицам - FB1.5
    #40055530
EvgErmak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KreatorXXI
спасибо
...
Рейтинг: 0 / 0
24 сообщений из 24, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Оптимальный запрос к двум таблицам - FB1.5
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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