![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
insert into <....> select <...> union select <...> = грабли [D7, Paradox]
petvv © (2007-02-12 13:53:00)Доброго времени суток!
Имеется следующий запрос
insert into temp.db
select Fuel.Marka, Osnovan.Name, SUM(TotOsnov.Lit) Litr,
SUM(TotOsnov.Cur) Summa,
((SUM(TotOsnov.Lit)*Fuel.Price)-SUM(TotOsnov.Cur)) Delta
from Fuel, TotOsnov, Osnovan
where
TotOsnov.ShiftTo>=:QDBeg and TotOsnov.ShiftTo<=:QDEnd
and
TotOsnov.Product=Fuel.Num
and
TotOsnov.Osnovanye=Osnovan.Num
group by Marka, Name
having SUM(TotOsnov.Cur)<>0
union
select Fuel.Marka, Osnovan.Name, SUM(TotOsnov.Lit) Litr,
SUM(TotOsnov.Cur) Summa,
((SUM(TotOsnov.Lit)*0)-SUM(TotOsnov.Cur)) Delta
from Fuel, TotOsnov, Osnovan
where
TotOsnov.ShiftTo>=:QDBeg and TotOsnov.ShiftTo<=:QDEnd
and
TotOsnov.Product=Fuel.Num
and
TotOsnov.Osnovanye=Osnovan.Num
group by Marka, Name
having SUM(TotOsnov.Cur)=0
при его инициализации ругается: Invalid use or keyword union
как с этой бедой бороться
petvv (2007-02-13 08:34:00) [1]Может быть ты и прав, но куда денешся от софтины кототрая написана на дельфях и под Paradox
Sergey13 (2007-02-13 08:17:00) [2]> [13] petvv © (13.02.07 07:19)
Это не с делфями геморой, а с проектированием приложения и БД.
MsGuns (2007-02-13 08:16:00) [3]>petvv © (13.02.07 07:19) [13]
>Гиморой конешно с дельфями, а в фоксе можно было разрулить на много проще. Но ни куда ни денешся.
Так что же мешает сделать "как в фоксе" - тупо вытянуть все три таблицы на "клиента" и босиком и с монтировкой while not eof со вставкой записей в рез.таблицу ?
petvv (2007-02-13 07:19:00) [4]Гиморой конешно с дельфями, а в фоксе можно было разрулить на много проще. Но ни куда ни денешся.
petvv (2007-02-13 07:10:00) [5]
> А последовательно 2 insert сделать нельзя?
Я в эту сторону уже думал и тоже склоняюсь к такому выводу, примерно так:
insert into temp.db
select Fuel.Marka, Osnovan.Name, SUM(TotOsnov.Lit) Litr,
SUM(TotOsnov.Cur) Summa,
((SUM(TotOsnov.Lit)*Fuel.Price)-SUM(TotOsnov.Cur)) Delta
from Fuel, TotOsnov, Osnovan
where
TotOsnov.ShiftTo>=:QDBeg and TotOsnov.ShiftTo<=:QDEnd
and
TotOsnov.Product=Fuel.Num
and
TotOsnov.Osnovanye=Osnovan.Num
group by Marka, Name
having SUM(TotOsnov.Cur)<>0
Следующий запрос:
insert into temp.db
select Fuel.Marka, Osnovan.Name, SUM(TotOsnov.Lit) Litr,
SUM(TotOsnov.Cur) Summa,
((SUM(TotOsnov.Lit)*0)-SUM(TotOsnov.Cur)) Delta
from Fuel, TotOsnov, Osnovan
where
TotOsnov.ShiftTo>=:QDBeg and TotOsnov.ShiftTo<=:QDEnd
and
TotOsnov.Product=Fuel.Num
and
TotOsnov.Osnovanye=Osnovan.Num
group by Marka, Name
having SUM(TotOsnov.Cur)=0
и далее таким же макаром
Update into temp.db (set .....) where (....)
select Fuel.Marka, Osnovan.Name, SUM(TotOsnov.Lit) Litr,
SUM(TotOsnov.Cur) Summa,
((SUM(TotOsnov.Lit)*Fuel.Price)-SUM(TotOsnov.Cur)) Delta
from Fuel, TotOsnov, Osnovan
where
TotOsnov.ShiftTo>=:QDBeg and TotOsnov.ShiftTo<=:QDEnd
and
TotOsnov.Product=Fuel.Num
and
TotOsnov.Osnovanye=Osnovan.Num
group by Marka, Name
having SUM(TotOsnov.Cur)<>0
и
Update into temp.db (set .....) where (....)
select Fuel.Marka, Osnovan.Name, SUM(TotOsnov.Lit) Litr,
SUM(TotOsnov.Cur) Summa,
((SUM(TotOsnov.Lit)*Fuel.Price)-SUM(TotOsnov.Cur)) Delta
from Fuel, TotOsnov, Osnovan
where
TotOsnov.ShiftTo>=:QDBeg and TotOsnov.ShiftTo<=:QDEnd
and
TotOsnov.Product=Fuel.Num
and
TotOsnov.Osnovanye=Osnovan.Num
group by Marka, Name
having SUM(TotOsnov.Cur)=0
petvv (2007-02-13 07:04:00) [6]
> ИМХО, вообще не ясно зачем выборка ВСЕХ записей разбивается
> на два запроса (=0 и не=0), а потом объединяется
А дёргается и объединяется потому, что есть клиенты, которые заправляются за наличку, т.е. TotOsnov.Cur<>0 и есть клиенты, которые заправляются по безналу, т.е. TotOsnov.Cur=0
Виталий Панасенко (2007-02-12 18:10:00) [7]
> MsGuns © (12.02.07 17:47) [9]
Да, там есть такая возможность. Смотри LocalSQL.HLP. Создаешь файло с запросом(например, select id, sum(summa) as summa from table group by id),
записываешь в файл с расширением SQL, бросаешь в папку БД - и вуаля!
select * from "SQl.SQL" where id=1
MsGuns (2007-02-12 17:47:00) [8]>ANB © (12.02.07 14:00) [1]
Paradox (Local SQL) не поодерживает вложенные запросы
>Mike Kouzmine © (12.02.07 15:07) [6]
>Использовать вьюшки
В парадоксе ?
По сабжу:
ИМХО, вообще не ясно зачем выборка ВСЕХ записей разбивается на два запроса (=0 и не=0), а потом объединяется
Desdechado (2007-02-12 15:25:00) [9]А последовательно 2 insert сделать нельзя?
Виталий Панасенко (2007-02-12 15:12:00) [10]Сделай вьюху и соедини вьюху и таблицу... Хотя, конечно, как период передать...Можно подзапросом попробовать
select fuel, sum(), (select sum(...) from table1 t2 where t1.id=t2.id and t2.ShiftTo between :Dat1 and :Dat2) Summa from table1 t1
where t1.ShiftTo between :Dat1 and :Dat2
Mike Kouzmine (2007-02-12 15:07:00) [11]Использовать вьюшки
Sergey13 (2007-02-12 15:04:00) [12]> Так вот надо каким то образом уместить их в одну таблицу
Можно попробовать на клиенте слить запросы в один CDS или нечто вроде RxMemoryData.
petvv (2007-02-12 14:55:00) [13]А сохраняю потому, что только пока разбираюсь и не знаю, как к моей проблеме подобраться.
В общем есть два идентичных запроса (один из нмх выше), которые дёргают одинаковые данные из одних и тех же таблиц, но из разных периодов дат. Так вот надо каким то образом уместить их в одну таблицу, выходной запрос, чтобы далее их подсунуть в GroupHeader для сравнения. Т.е.
ГСМ Данные за 1 период Данные за 2 период % разница
Данные за 1 период Данные за 2 период % разница
Sergey13 (2007-02-12 14:18:00) [14]Вряд ли пройдет такое.
Да и зачем это сохранять?
Правильный Вася (2007-02-12 14:02:00) [15]почитать localsql.hlp
?
ANB (2007-02-12 14:00:00) [16]так попробуй (без гарантии)
insert into temp.db
select * from (
select Fuel.Marka, Osnovan.Name, SUM(TotOsnov.Lit) Litr,
SUM(TotOsnov.Cur) Summa,
((SUM(TotOsnov.Lit)*Fuel.Price)-SUM(TotOsnov.Cur)) Delta
from Fuel, TotOsnov, Osnovan
where
TotOsnov.ShiftTo>=:QDBeg and TotOsnov.ShiftTo<=:QDEnd
and
TotOsnov.Product=Fuel.Num
and
TotOsnov.Osnovanye=Osnovan.Num
group by Marka, Name
having SUM(TotOsnov.Cur)<>0
union
select Fuel.Marka, Osnovan.Name, SUM(TotOsnov.Lit) Litr,
SUM(TotOsnov.Cur) Summa,
((SUM(TotOsnov.Lit)*0)-SUM(TotOsnov.Cur)) Delta
from Fuel, TotOsnov, Osnovan
where
TotOsnov.ShiftTo>=:QDBeg and TotOsnov.ShiftTo<=:QDEnd
and
TotOsnov.Product=Fuel.Num
and
TotOsnov.Osnovanye=Osnovan.Num
group by Marka, Name
having SUM(TotOsnov.Cur)=0
)