Форум: "Базы";
Текущий архив: 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.036 c