Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.11.06;
Скачать: CL | DM;

Вниз

формирование запроса   Найти похожие ветки 

 
erika ©   (2005-09-24 16:17) [0]

Здравствуйте!
задача  заключается в  следующем:
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

Где в данном  запросе поставить условие?


 
Johnmen ©   (2005-09-25 02:02) [1]

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


 
erika ©   (2005-09-26 10:29) [2]

так не  получается...
кто - нибудь помогите!!!!!


 
erika ©   (2005-09-26 10:39) [3]

если  конкретнее, то  пытаюсь на писать запрос  следующим  образом

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

виснет


 
Sergey13 ©   (2005-09-26 10:44) [4]

2[3] erika ©   (26.09.05 10:39)
>виснет
Не мудрено. Потому что неправильно все. 8-)
Groub by - убери и соединение таблиц вставь в подзапрос.


 
evvcom ©   (2005-09-26 10:44) [5]

1. Зачем "INNER JOIN KOL_POKUPOK ON (KLIENTS.INK = KOL_POKUPOK.IDK)"?
2. Зачем "group by KLIENTS.NAMEC"? Здесь нет агрегатных функций.


 
erika ©   (2005-09-26 10:47) [6]

сейчас...


 
erika ©   (2005-09-26 10:52) [7]

мне надо получить количество записей  в  view KOL_POKUPOK сгруппированных по  полю KLIENTS.NAMEC  которые  связаны  по полю INK

> INNER JOIN KOL_POKUPOK ON (KLIENTS.INK = KOL_POKUPOK.IDK)

извините KOL_POKUPOK.INK


 
evvcom ©   (2005-09-26 11:32) [8]

1. Для удобства используй синонимы.
2. В твоем внешнем селекте не выбираются поля из KOL_POKUPOK. Единственно чем можно объяснить употребление здесь inner join - это чтобы ограничить количество выходных записей в соответствии с наличием ключевых полей в KOL_POKUPOK и отсутствии foreign key, что в свою очередь тоже является неверным.
3. Внутренний селект никак не связан с внешним.


 
erika ©   (2005-09-26 13:01) [9]

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

зависает, в  чем  проблема, помогите  пожалуйста


 
Sergey13 ©   (2005-09-26 13:09) [10]

А скока записей? А индекы есть? Какие?


 
erika ©   (2005-09-26 13:19) [11]

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:30) [12]

2[11] erika ©   (26.09.05 13:19)
>klients всего содержит 70 000
По твоему запросу, каждый подзапрос выполняется 70000 раз. А с учетом proc15 это будет... это будет... сама вобщем умножай. 8-)
Он не виснет, а работает. 8-)
А почему
>по идее должно  получиться  23 строки
? Откуда это видно?


 
erika ©   (2005-09-26 13:32) [13]

если это группировать по  namec , то их  всего 23 различных значения


 
evvcom ©   (2005-09-26 13:38) [14]

Ну вот, хоть что-то разумное написал. Если не надеяться, что оптимизатор "умный" и перепишет наш запрос "как положено", то давай посмотрим, что выходит. С каждой строкой внешнего запроса должен выполниться внутренний. В итоге выходит около 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:58) [15]

Всем  большое спасибо, проблема  решена.
evvcom ©   (26.09.05 13:38) [14] подошло как никогда


 
evvcom ©   (2005-09-26 14:14) [16]


> Ну вот, хоть что-то разумное написал.

О, прошу прощения! Только сейчас заглянул в анкету. Правильно будет "написала".



Страницы: 1 вся ветка

Текущий архив: 2005.11.06;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.046 c
4-1125834545
Valera
2005-09-04 15:49
2005.11.06
CDROM для мультимедия


1-1128978861
Ricks
2005-10-11 01:14
2005.11.06
Рисование поверхностей (желательно OpenGL)


1-1129278586
Prohodil Mimo
2005-10-14 12:29
2005.11.06
Как установить фокус на компонент?


2-1129109894
MD2005
2005-10-12 13:38
2005.11.06
определение цвета в точках


1-1129711467
saNat
2005-10-19 12:44
2005.11.06
Упорядочение создания компонент