|
|
|
|
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
|
|