Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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
)


Наверх

Титульная страница Поиск, карта сайта Написать письмо