Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2005.11.06;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.037 c
2-1129369490
RzCoDer
2005-10-15 13:44
2005.11.06
Дин массивы


1-1129528210
Карелин Артем
2005-10-17 09:50
2005.11.06
Как сохранить/считать свойства потомка TObject в строку?


2-1129301519
intel
2005-10-14 18:51
2005.11.06
удаление файла


2-1129186502
Monk
2005-10-13 10:55
2005.11.06
Вопрос по SQL


14-1129567066
ArtemESC
2005-10-17 20:37
2005.11.06
Эффективный алгоритм





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский