![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проблема с запросом...(LEFT JOIN) [D6, dBase, FoxPro]
SergP © (2004-07-29 15:52:00)БД 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 17:31:00) [1]Не надо промежуточных.
Просто выполни ряд запросов, в каждом из которых не более одного соединения.
Если их результаты надо собрать в один НД, попробуй UNION.
SergP (2004-07-29 17:26:00) [2]
> Johnmen © (29.07.04 16:51) [6]
Как сделать несколько запросов? Т.е. где должен быть промежуточный результат? Пробовал так как я описал в сабжевом посте (вариант с несколькими запросами), но почему-то промежуточная таблица не формируется. И при выполнении последнего запроса выскакивает ошибка что нет файла (таблицы), который по идее должен был сформироваться предыдущим запросом, который я пробовал делать ADOConnection1.Execute
Johnmen (2004-07-29 16:51:00) [3]>SergP © (29.07.04 16:13) [3]
Это понятно, что будет неверно считаться. Даже если внутреннее соединение.
Потому, что это фактически попытка посчитать в одном запросе "несовместимые" сущности, сделать типа кросс-таблицы...
Простейший выход - несколько запросов.
stud (2004-07-29 16:32:00) [4]так может использовать внешнее обединение? только определиться с ведущей таблицей
SergP (2004-07-29 16:21:00) [5]т.е. суммы не правильно считались если я делал групировку в основном запросе. Если не делать групировку то видно даже почему они неправильно считались: если для одной записи в podat.dbf выбирались по 3 записи из каждого джоина, тов результате я получал 9 записей... и поэтому при групировке суммы утраивались...
поэтому я решил сделать делать вложенные запросы и групировать в них... Но почему-то такие запросы где используется левый джоин не из таблицы, а из вложенного запроса select вообще не работают. Получаю сообщение об ошибке в запросе..
SergP (2004-07-29 16:13:00) [6]
> 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:12:00) [7]
> 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 джоина)
Johnmen (2004-07-29 16:02:00) [8]М.б. тебе надо просто
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