На главную
Подписка
Новости


Рейтинг@Mail.ru











Главная / DELPHI / Часто задаваемые вопросы и ответы на них / Разработка баз данных - SQL Сделать домашней страницей Добавить в избранное Написать писмо

SQL


»»» Merle Corey (07.07.00 12:36)
Существует следующая проблема: есть 4 таблицы в БД ORACLE -- Карточки, Пересылки, Исполнители и Департаметы. Связь сл. : К каждому департаменту привязаны исполнители. С исполнителями связаны пересылки. Ну а Пересылки связаны с карточками.
Необходимо подсчитать кол-во карточек для каждого департамента. Как это сделать пошустрее.

»»» kingdom - kingdom@tepkom.ru (08.07.00 21:27)
У меня были похожие проблемы, пришлось делять вложенный СКуЛь запрос типа select ... from (select .. from (select ...)) ну и применить соответсвующую функцию для подсчета (если очень дано могу позже написать как сейчас не помню),   ... ну млм же вот в Access можно делать запросы прямо в самой MS-Access к которым можно обращаться как к обычным таблицам только понятно их физически нет, так вот в запрос включить все столбцы Карточек и столбец с ID из Департамента тогда все должно быть быстро, попробуй...

-= Из конференции сайта MASTERS OF DELPHI (http://delphi.mastak.com) =-

Комментарий: "Anton Khalikov" (admin@karat-e.medialt.ru)

Прикольно, но чуваки забывают, что есть еще понятие view, которое как раз и реализует то же, что и "ну млм же вот в Access можно делать запросы прямо в самой MS-Access к которым можно обращаться как к обычным таблицам только понятно их физически нет"
т.е. пишется просто - create view test as select ...
и дальше select ... from test, ...
ну а в крайнем случае можно написать хранимую процедуру.


Комментарий от "Vladimir Krinitsin" (vvkrinitsin@hotmail.com)
обычно делают так:

select count(Карточки.*), Деп.Имя from Карточки
join Пересылки on ... join Исп. on... join Деп on...
group by Деп.Имя


Комментарий от "Grigory V Dutikov" (dutikov@accum.kursk.ru)
Правильно для ORACLE:

create view CountCard
as select count( k.*), d.DepName
from Департамент d, Исполнители e, Пересылки p, Карточки k
where d.DepName = e.DepName
and   e.ExeName = p.ExeName
and   p.KardName = k.KardName

P.S.
Если на сервере русская кодировка, то имена таблиц и полей можно
писать по русски и без кавычек!!! в Oracle8i и выше

---- Комментарий от Michael Strelkov ----
В запросе от "Grigory V Dutikov" пропущен group by d.DepName.
То есть, должно быть так:

create view CountCard as
select d.DepName, count( k.*) as Number_of_Kards
from Департамент d, Исполнители e, Пересылки p, Карточки k
where d.DepName = e.DepName
       and   e.ExeName = p.ExeName
       and   p.KardName = k.KardName
group by d.DepName.

Но если эти таблички достаточно большие, то работать это может довольно медленно.
Но можно слегка оптимизировать:
1) если поля связи не описаны явно как foreign keys, или по ним нет индексов, то создайте их.
2) в предл. from разместите таблицы по убыванию их размеров.
3) в предл. where разместите условия по and, так, чтобы в конце были те, по которым производится максимальный отсев лишних записей, т.к and обрабатываются справа налево.

Если все это не поможет, то надо поработать над исходными таблицами. Возможно, они не нужны целиком в данном запросе, и есть возможность что-то из них выбросить (наверняка есть лишние столбцы, т. к. из каждой таблицы нужны только столбцы для связи, и, особенно лишние строки). Тогда в запросе в предл. from, вместо указания имен таблиц XXXXXXXX x, напишете такие некореллированные подзапросы:
(select YYYYY from XXXXXX where <условие, которое оставляет только нужные строки>) x. Если Вам удастся таким образом существенно уменьшить размеры используемых в запросе таблиц, скорость выполнения может увеличиться на 1-3 порядка.

Copyright ©   "Мастера DELPHI"   E-mail:   delphi@mastak.com  http://www.delphimaster.ru
Источник получения информации: http://www.delphimaster.ru
Hosted by uCoz