![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
формирование запроса [D6, IB6.x]
erika © (2005-09-24 16:17:00)Здравствуйте!
задача заключается в следующем:
1. существуют 2 таблицы А В
2. В таблице В есть поля TOWN и ID
3. В таблице А есть поля ID SUM
не могу сообразить как правильно записать запрос: что бы в proc1 показывалось количество записей a.sum =3 (предположим), в proc2 - a.sum=4 и т.д.
Запрос:
select count(a.sum)proc1, count(a.sum)proc2, count(a.sum)proc3
from a,b
inner join a on a.id=b.id
group by b.town
Где в данном запросе поставить условие?
evvcom (2005-09-26 14:14:00) [1]
> Ну вот, хоть что-то разумное написал.
О, прошу прощения! Только сейчас заглянул в анкету. Правильно будет "написала".
erika (2005-09-26 13:58:00) [2]Всем большое спасибо, проблема решена.
evvcom © (26.09.05 13:38) [14]подошло как никогда
evvcom (2005-09-26 13:38:00) [3]Ну вот, хоть что-то разумное написал. Если не надеяться, что оптимизатор "умный" и перепишет наш запрос "как положено", то давай посмотрим, что выходит. С каждой строкой внешнего запроса должен выполниться внутренний. В итоге выходит около 70 000 сканирований таблицы kol_pok по 75 000 записей! Как ты думаешь, сколько времени потребуется на это серверу?
Я не знаю, как ведет себя FB в этом случае, Oracle с довольно "умным" оптимизатором такие запросы пытается переписать, но и у него не всегда это получается.
Попробуй так:
SELECT
k.namec,
count(kp.count_of_idk) as proc0
FROM KLIENTS k -- Вообще-то пишется "Clients"
INNER JOIN KOL_POKUPOK kp
ON kp.ink=k.ink
WHERE
kp.count_of_idk = 1
GROUP BY k.namec
erika (2005-09-26 13:32:00) [4]если это группировать по namec , то их всего 23 различных значения
Sergey13 (2005-09-26 13:30:00) [5]2[11] erika © (26.09.05 13:19)
>klients всего содержит 70 000
По твоему запросу, каждыйподзапрос выполняется 70000 раз. А с учетом proc15 это будет... это будет... сама вобщем умножай. 8-)
Он не виснет, а работает. 8-)
А почему
>по идее должно получиться 23 строки
? Откуда это видно?
erika (2005-09-26 13:19:00) [6]klients всего содержит 70 000, kol_pok примерно 75 000
по идее должно получиться 23 строки и 13 столбцов
namec proc0 proc5 ... proc15
Уфа 102 456 10
Воронеж 458 402 560
Москва 250 45 214
Sergey13 (2005-09-26 13:09:00) [7]А скока записей? А индекы есть? Какие?
erika (2005-09-26 13:01:00) [8]SELECT KLIENTS.namec,
(select count(kol_pokupok.count_of_idk)
from kol_pokupok
where (kol_pokupok.ink=klients.ink) and (kol_pokupok.count_of_idk = 1)) as proc0
FROM KLIENTS
зависает, в чем проблема, помогите пожалуйста
evvcom (2005-09-26 11:32:00) [9]1. Для удобства используй синонимы.
2. В твоем внешнем селекте не выбираются поля из KOL_POKUPOK. Единственно чем можно объяснить употребление здесь inner join - это чтобы ограничить количество выходных записей в соответствии с наличием ключевых полей в KOL_POKUPOK и отсутствии foreign key, что в свою очередь тоже является неверным.
3. Внутренний селект никак не связан с внешним.
erika (2005-09-26 10:52:00) [10]мне надо получить количество записей в view KOL_POKUPOK сгруппированных по полю KLIENTS.NAMEC которые связаны по полю INK
> INNER JOIN KOL_POKUPOK ON (KLIENTS.INK = KOL_POKUPOK.IDK)
извините KOL_POKUPOK.INK
erika (2005-09-26 10:47:00) [11]сейчас...
Sergey13 (2005-09-26 10:44:00) [12]2[3] erika © (26.09.05 10:39)
>виснет
Не мудрено. Потому что неправильно все. 8-)
Groub by - убери и соединение таблиц вставь в подзапрос.
evvcom (2005-09-26 10:44:00) [13]1. Зачем "INNER JOIN KOL_POKUPOK ON (KLIENTS.INK = KOL_POKUPOK.IDK)"?
2. Зачем "group by KLIENTS.NAMEC"? Здесь нет агрегатных функций.
erika (2005-09-26 10:39:00) [14]если конкретнее, то пытаюсь на писать запрос следующим образом
SELECT KLIENTS.NAMEC, (select count(KOL_POKUPOK.count_of_idk) from KOL_POKUPOK where KOL_POKUPOK.count_of_idk = 1) proc0
FROM KLIENTS
INNER JOIN KOL_POKUPOK ON (KLIENTS.INK = KOL_POKUPOK.IDK)
group by KLIENTS.NAMEC
виснет
erika (2005-09-26 10:29:00) [15]так не получается...
кто - нибудь помогите!!!!!
Johnmen (2005-09-25 02:02:00) [16]select
select count(a.sum) proc1 from ... where ...,
select count(a.sum) proc2 from ... where ...,
select count(a.sum) proc3 from ... where ...
и т.д.
from a,b
inner join a on a.id=b.id
group by b.town