powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Помогите оптимизировать запрос к нескольким таблицам
15 сообщений из 15, страница 1 из 1
Помогите оптимизировать запрос к нескольким таблицам
    #35512307
Bananas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет. Есть 5 таблиц.

Хозяйство--Связь1:М--Люди--Транспорт--Справочник транспорта.

Хозяйство: код_хозяйства(PK), прочие поля, для запроса не нужные (адрес и т.п.).
Связь1:М: код(PK), код_хозяйства(FK), код_человека(FK)
Люди: код_человека (PK), и прочее.
Транспорт: код_транспорта(PK), код_человека (FK), код_транспорта_из_справочника(FK), количество
Справочник: код_справочника(PK), имя ('Тракторы', 'Легковые автомобили' и т.п.).

Задача - выбрать количество определенного транспорта для одного хозяйства.
Проблема в том, что транспорт завязан на человека, а уж человек состоит в хозяйстве (по схеме).
Получается несколько запросов: 1) выбираем всех людей, состоящих в одном хозяйстве; 2) выбираем количество определенного транспорта (например 'Тракторы') в диапазоне людей из одного хозяйства (результат предыдущего запроса).
Я делаю через AND, но запрос выглядит монстрячим и, наверняка, тяжелым. Как его можно оптимизировать? На основе запроса нужно будет сформировать отчет, поэтому, наверное, нужно все сделать в одном запросе.
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос к нескольким таблицам
    #35512323
облегчите нам задачу,
если положите сюда примерные таблички
+ покажите Ваш запрос

если кратенько, для вкл-я оптимизации
1. вкл-ем set opti
2. создаем индексы по полям,
которые есть в условиях выборки + бинарный индекс по deleted()
при set dele on
3. пишем условия правильно, используя только оптимиз-е выраж-я
(все это есть в хелпе)
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос к нескольким таблицам
    #35512359
Bananas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ок. сейчас нарисую.
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос к нескольким таблицам
    #35512548
Bananas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
select sum(means.quantity) 
   from 
              economy,
              maneconrelation,
              people,
              means,
              spr_means
   where
              (economy.id=maneconrelation.economyid) 
              AND
              (maneconrelation.manid=people.id)
              AND 
              (people.id=means.manid) 
              AND
              (means.id=spr_mean.id) 
              AND
              spr_mean.name='Тракторы'
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос к нескольким таблицам
    #35512574
Bananas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
опечатался: в FROM spr_mean, а не spr_means
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос к нескольким таблицам
    #35512621
Bananas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Исправил:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
select sum(means.quantity) 
   from 
              economy,
              maneconrelation,
              people,
              means,
              spr_mean
   where
              (economy.id=maneconrelation.economyid) 
              AND
              (maneconrelation.manid=people.id)
              AND 
              (people.id=means.manid) 
              AND
              (means.meanscode=spr_mean.id) 
              AND
              spr_mean.name='Тракторы'
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос к нескольким таблицам
    #35512640
Sergey Sizov.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
select sum(means.quantity) 
   from 
              economy
              inner join maneconrelation on economy.id=maneconrelation.economyid
              inner join people on maneconrelation.manid=people.id
              inner oin means on people.id=means.manid
              inner join spr_mean on means.meanscode=spr_mean.id
   where
              spr_mean.name='Тракторы'
[/quot]
При этом лучше отдельно найти spr_mean.id и тогда из запроса можно выкинуть последний join.
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос к нескольким таблицам
    #35512652
12345зайчик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
2.
3.
4.
5.
6.
select sum(m.quantity) ;
   from means m ;
	inner join spr_mean          s on m.id=s.id and s.name='Тракторы' ;
	inner join people              p on p.id=m.manid ;
	inner join maneconrelation c on c.manid=p.id ;
	inner join economy           e on e.id=c.economyid and e.id= ....
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос к нескольким таблицам
    #35512863
Galyamov Rinat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: 12345зайчик

spr_mean надо поставить самым первым и в конструкции и использовать
директиву where с условием
А так же создать индекс по полю spr_mean.name


Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос к нескольким таблицам
    #35513179
leaf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вообще то таблица хозяйство для запроса не нужна или как?
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос к нескольким таблицам
    #35513555
Bananas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
leafвообще то таблица хозяйство для запроса не нужна или как?
Нужна. Вся техника, приписанная к одному хозяйству.

Sergey Sizov.[src]
При этом лучше отдельно найти spr_mean.id и тогда из запроса можно выкинуть последний join.
То есть?
Пробовал выполнить, фокс не отвечает, при этом не виснет (фокс 9). Посмотрю запрос еще, может я его неправильно составил.
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос к нескольким таблицам
    #35514624
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В принципе, что Ваш первоначальный запрос, что запрос с JOIN - это одно и то же. Просто по разному оформленное. Так что, с этой точки зрения, разницы никакой.

Однако у Вас явно лишняя связка с таблицей "люди", поскольку "код_человека" есть как в таблице "Связь", так и в таблице "Транспорт". Зачем же вводить лишнего посредника, если эти две таблицы можно связать напрямую.

Тогда в результате имеем

Код: plaintext
1.
2.
3.
4.
5.
6.
select sum(means.quantity) 
from economy
inner join maneconrelation on economy.id=maneconrelation.economyid
inner join means on maneconrelation.manid=means.manid
inner join spr_mean on means.meanscode=spr_mean.id
where spr_mean.name='Тракторы'

В данном случае получаем сумму всех тракторов по всем хозяйствам.

По поводу того, что сказал Сергей. Если речь идет именно и только о тракторах, то логично сначала, отдельным запросом, получить код записи "Тракторы" в справочнике техники, а потом искать данные уже по найденному коду

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
LOCAL laSpr_meanID( 1 )
SELECT spr_mean.id FROM spr_mean INTO ARRAY laSpr_meanID WHERE spr_mean.name='Тракторы'

select sum(means.quantity) 
from economy
inner join maneconrelation on economy.id=maneconrelation.economyid
inner join means on maneconrelation.manid=means.manid
where means.meanscode=m.laSpr_meanID
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос к нескольким таблицам
    #35514627
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, если задача ставится наоброт: вся техника по одному хозяйству, то аналогичную операцию делаем с таблицей "Хозяйства", а не со справочником техники.
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос к нескольким таблицам
    #35515001
Андрей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все советы не особо помогают, т.к. число таблиц в запросе остаётся равным 5.
Надо сделать так, как Вы намечали:
. Найти всех людей заданного хозяйства, поместив их в массив aPeaple (Sql-запросом)
. Для всех найденых людей найти технику. Для отбора можно использовать функцию
ASCAn(aPeaple,means.manid) >0. Записать отобранную технику в курсор, по которому и сделать отчёт
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос к нескольким таблицам
    #35518683
Bananas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey Sizov. , Андрей К , ВладимирМ , большое спасибо! С sql серьезно не знаком, много полезного узнал. Пока проверил запрос Сергея. Работает шустро. По сравнению с моим с ANDами - тот вообще фокс повесил:)
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Помогите оптимизировать запрос к нескольким таблицам
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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