Текущий архив: 2004.08.22;
Скачать: CL | DM;
Вниз
Проблема с запросом...(LEFT JOIN) Найти похожие ветки
← →
SergP © (2004-07-29 15:52) [0]БД FOXPRO
Запросы:
select p,sum(plm) as plm,sum(mon) as mon
from mytable1
where vb=30
group by p
и
select podat.p, podat.name, a.plm as dplan, a.mon as dfakt
from podat
left join mytable2 a on (podat.p=a.p)
по отдельности работают, однако когда я делаю вложенный запрос:
select podat.p, podat.name, a.plm as dplan, a.mon as dfakt
from podat
left join
(select p,sum(plm) as plm,sum(mon) as mon from mytable1 where vb=30 group by p) a on (podat.p=a.p)
то не хочет работать...
Уже решил попробовать создавать типа временной таблицы:
ADOConnection1.Execute("select p,sum(plm) as plm ,sum(mon) as mon from mytable1 where vb=30 group by p into table mytable2");
чтобы потом использовать ее в основном запросе, но эта таблица почему-то не создается...
Что делать?
Желательно если можно помогите с вложенный запросом,
а если нельзя то как сделать с помощью создания промежуточной таблицы?
← →
Johnmen © (2004-07-29 16:02) [1]М.б. тебе надо просто
select T1.p, T1.name, sum(T2.plm) as dplan, sum(T2.mon) as dfakt
from podat T1
left join mytable1 T2 on (T1.p=T2.p)
where T2.vb=30
group by T1.p, T1.name
← →
SergP © (2004-07-29 16:12) [2]
> Johnmen © (29.07.04 16:02) [1]
Дело в том что это запрос я упростил... На самом деле у меня там 2 левых джоина. Вобщем вот такой у меня запрос на самом деле(правда не рабочий):
fplan, ffakt:string; // там имена полей хранятся...
...
zsql:="select podat.p, podat.name, nvl(a."+fplan+",0)+nvl(b."+fplan+",0) as zplan,nvl(a."+ffakt+",0)+nvl(b."+ffakt+",0) as zfakt, a."+fplan+" as dplan, a."+ffakt+" as dfakt, b."+fplan+" as mplan, b."+ffakt+" as mfakt "
+"from podat "
+"left join (select p,sum("+fplan+") as "+fplan+",sum("+ffakt+") as "+ffakt+" from "+base+" where vb=30 group by p) a on (podat.p=a.p) "
+"left join (select p,sum("+fplan+") as "+fplan+",sum("+ffakt+") as "+ffakt+" from "+base+" where vb=50 group by p) b on (podat.p=b.p) "
+"order by podat.ord";
Вашим способом тоже ранее пробовал делать, но суммы неправильно считаются.(наверное из-за того что 2 джоина)
← →
SergP © (2004-07-29 16:13) [3]
> Johnmen © (29.07.04 16:02) [1]
Дело в том что это запрос я упростил... На самом деле у меня там 2 левых джоина. Вобщем вот такой у меня запрос на самом деле(правда не рабочий):
fplan, ffakt:string; // там имена полей хранятся...
base:string; // там имя таблицы
...
zsql:="select podat.p, podat.name, nvl(a."+fplan+",0)+nvl(b."+fplan+",0) as zplan,nvl(a."+ffakt+",0)+nvl(b."+ffakt+",0) as zfakt, a."+fplan+" as dplan, a."+ffakt+" as dfakt, b."+fplan+" as mplan, b."+ffakt+" as mfakt "
+"from podat "
+"left join (select p,sum("+fplan+") as "+fplan+",sum("+ffakt+") as "+ffakt+" from "+base+" where vb=30 group by p) a on (podat.p=a.p) "
+"left join (select p,sum("+fplan+") as "+fplan+",sum("+ffakt+") as "+ffakt+" from "+base+" where vb=50 group by p) b on (podat.p=b.p) "
+"order by podat.ord";
Вашим способом тоже ранее пробовал делать, но суммы неправильно считаются.(наверное из-за того что 2 джоина)
← →
SergP © (2004-07-29 16:21) [4]т.е. суммы не правильно считались если я делал групировку в основном запросе. Если не делать групировку то видно даже почему они неправильно считались: если для одной записи в podat.dbf выбирались по 3 записи из каждого джоина, тов результате я получал 9 записей... и поэтому при групировке суммы утраивались...
поэтому я решил сделать делать вложенные запросы и групировать в них... Но почему-то такие запросы где используется левый джоин не из таблицы, а из вложенного запроса select вообще не работают. Получаю сообщение об ошибке в запросе..
← →
stud (2004-07-29 16:32) [5]так может использовать внешнее обединение? только определиться с ведущей таблицей
← →
Johnmen © (2004-07-29 16:51) [6]>SergP © (29.07.04 16:13) [3]
Это понятно, что будет неверно считаться. Даже если внутреннее соединение.
Потому, что это фактически попытка посчитать в одном запросе "несовместимые" сущности, сделать типа кросс-таблицы...
Простейший выход - несколько запросов.
← →
SergP © (2004-07-29 17:26) [7]
> Johnmen © (29.07.04 16:51) [6]
Как сделать несколько запросов? Т.е. где должен быть промежуточный результат? Пробовал так как я описал в сабжевом посте (вариант с несколькими запросами), но почему-то промежуточная таблица не формируется. И при выполнении последнего запроса выскакивает ошибка что нет файла (таблицы), который по идее должен был сформироваться предыдущим запросом, который я пробовал делать ADOConnection1.Execute
← →
Johnmen © (2004-07-29 17:31) [8]Не надо промежуточных.
Просто выполни ряд запросов, в каждом из которых не более одного соединения.
Если их результаты надо собрать в один НД, попробуй UNION.
Страницы: 1 вся ветка
Текущий архив: 2004.08.22;
Скачать: CL | DM;
Память: 0.47 MB
Время: 0.024 c