Форум: "Базы";
Текущий архив: 2003.11.13;
Скачать: [xml.tar.bz2];
ВнизParadox: Select id, (select sum( ... Найти похожие ветки
← →
Sandman25 (2003-10-16 17:18) [0]Доброе время суток.
Пытаюсь в SQL Explorer выполнить запрос вида
select id,
count(*),
(select ... from table where id = another.id)
from another, third, ...
...
group by id
Если вложенный запрос возвращает ровно одну запись, то в результате в последнем поле всегда получаю пустоту (Null)... даже с запросом select count(*).
Если вложенный запрос возвращает больше одной записи, то совершенно правильно ругается "Single row subquery produced more than one row."
Paradox такие селекты поддерживает вообще?
Если не поддерживает, то почему не ругается Capability not supported?
Если поддерживает, то как добиться, чтобы возвращал не Null?
Я в LocalSQL пошастал, но там SELECT очень скудно описывается, вложенные select даже не упоминаются.
Спасибо.
← →
Reindeer Moss Eater (2003-10-16 17:21) [1]В SQL есть существенная разница между Count(*) и Count(имя_поля)
← →
SasaR (2003-10-16 17:24) [2]Какая ? (если н использовать group by....)
← →
MsGuns (2003-10-16 17:24) [3]В данном случае, ИМХО, лучше использовать связки (JOIN). Но для полной ясности не плохо было б поподробнее описать задачу
← →
MsGuns (2003-10-16 17:26) [4]>Paradox такие селекты поддерживает вообще?
Парадокс-то тут причем ? Другое дело BDE..
>Я в LocalSQL пошастал, но там SELECT очень скудно описывается, вложенные select даже не упоминаются.
Упоминаться-то упоминаются, но скудно, что верно, то верно..
← →
Sandman25 (2003-10-16 17:27) [5]Если подробно, то задача такая: получить
число заказов, число блюд и себестоимость потраченных продуктов в разрезе чего-нибудь (например, в разрезе официантов, блюд или дат).
Получаем такой select:
select zakaz_dish.dish_id,
count(distinct zakaz.id),
sum(zakaz_dish.portion_amount),
sum(zakaz_dish.amount*zakaz_dish.price),
(select sum(zakaz_comp.amount*zakaz_comp.stoim)
from zakaz_comp
where zakaz_comp.zakaz_dish_id=zakaz_dish.id
)
from zakaz,
zakaz_dish
where zakaz.id=zakaz_dish.zakaz_id
group by dish_id
← →
Sandman25 (2003-10-16 17:50) [6]Видимо, не получится.
select id, count(*),
(select sum(zakaz_comp.amount*zakaz_comp.stoim)
from zakaz_comp
where zakaz_comp.zakaz_dish_id=zakaz_dish.id
)
from zakaz_dish
where ZAKAZ_DISH.ID=8
group by ZAKAZ_DISH.id
Возвращает 8,1,Null
select id, count(*),
(select sum(zakaz_comp.amount*zakaz_comp.stoim)
from zakaz_comp
where zakaz_comp.zakaz_dish_id=8
)
from zakaz_dish
where ZAKAZ_DISH.ID=8
group by ZAKAZ_DISH.id
Возвращает 8,1,7.
Видимо, придется делать вычисляемое поле и в OnCalculateField запускать отдельный Query с подзапросом :(
← →
Johnmen (2003-10-16 17:59) [7]>Sandman25 ©
Что получится ? Если
select id, count(*),
(select sum(zakaz_comp.amount*zakaz_comp.stoim)
from zakaz_comp
where (zakaz_comp.zakaz_dish_id=zakaz_dish.id)
or (zakaz_comp.zakaz_dish_id=8)
)
from zakaz_dish
where ZAKAZ_DISH.ID=8
group by ZAKAZ_DISH.id
И вот так
select id, count(*),
(select sum(zakaz_comp.amount*zakaz_comp.stoim)
from zakaz_comp
where (zakaz_comp.zakaz_dish_id=zakaz_dish.id)
or (zakaz_dish.id=8)
)
from zakaz_dish
where ZAKAZ_DISH.ID=8
group by ZAKAZ_DISH.id
← →
Sandman25 (2003-10-16 18:02) [8][7] Johnmen © (16.10.03 17:59)
8,1,7
8,1,Null
← →
Sandman25 (2003-10-16 18:07) [9](select sum(zakaz_comp.amount*zakaz_comp.stoim)
from zakaz_comp
where zakaz_dish.id is null
)
from zakaz_dish
where ZAKAZ_DISH.ID=8
group by ZAKAZ_DISH.id
Возвращает 8,1,15.60
Такое ощущение, что при выполнении подзапроса все остальные таблицы считаются "обнуленными". У меня же zakaz_dish_id не может быть null в принципе: во-первых, стоит флажок required, а во-вторых, я всю таблицу из 8 строк скоро наизусть запомню - ну нету там нулов, нету :(
← →
ЮЮ (2003-10-17 07:04) [10]Да бросьте вы, Парадох, к счастью, не поддерживает такие подзапросы
SELECT ID, q1.Cnt1, q2.Sum2
FROM
table
LEFT JOIN "q1.sql" q1 ON table1.id = q1.id
LEFT JOIN "q2.sql" q2 ON table1.id = q2.id
где в тексте агрегирующих запросов qX
должен заранее динамически сформированы условия отбора (т.е. тот самый "разрез", т.к. в этих запросах не поддерживаются параметры)
← →
Sandman25 (2003-10-17 10:08) [11][10] ЮЮ © (17.10.03 07:04)
Насколько я понял, Paradox не поддерживает Left Join, во всяком случае, так показали мои вчерашние опыты. У меня запросы формируются динамически, с кучей фильтров, поэтому заранее заготовить все "view" не очень хочется.
Я нашел другой выход - агрегатное значение себестоимости блюда записываю в таблицу связи блюда-заказа, а не рассчитываю по потраченным продуктам для отчета, как раньше. Поэтому теперь вложенный запрос не нужен :)
Всем спасибо!
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2003.11.13;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.034 c