![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
любопытное поведение union all в SQL через BDE... [D5, dBase, FoxPro, ]
WildWind © (2001-12-07 10:48:00)Динамически формирую запрос. Получаю:
select nt, count(*) as cnt, sum(pr) as sum_pr, sum(sm)/100 as sum_sm
from "base_1.dbf" a
where (a.nt=4200)
group by nt
union all
select nt, count(*) as cnt, sum(pr) as sum_pr, sum(sm)/100 as sum_sm
from "base_2.dbf" a
where (a.nt=4200)
group by nt
order by nt
Мало того, что этот диалект требует, чтобы where был именно
после from (т.е. до group и order), так он еще и обрабатывается хитро!
По идее (и, например, в FoxPro так и есть) должна получиться одна строка, где nt=6044200 и дальше как заказывали. Но эта гадина выдает количество строк столько, сколько раз будет union all (в данном примере - две). Т.е. при включении в запрос еще одной базы по union я получаю уже 3 строки. Грешил на count(*), но дело не в нем.
Как победить, чтобы не делать промежуточную базу?
Хотя скорее всего так и придется... :(
WildWind (2001-12-10 09:35:00) [1]2Dim666
Эта мысль была у меня самой первой ;)
Изящно, но не работает! :(
Dim666 (2001-12-07 18:01:00) [2]А ты его в такую штуку оберни:
SELECT DISTINCT *
FROM (
)
:)
WildWind (2001-12-07 17:49:00) [3]Убирал я ALL из UNION... а счастья так и нет.
Похоже, что Desdechado прав, но уж больно неуклюжая конструкция выходит. Как-то нелогично...
asafr (2001-12-07 16:13:00) [4]Действительно, используй не UNION ALL, а просто UNION
Alexandr (2001-12-07 15:03:00) [5]2 строки и должно быть
хочешь одной строкой (т.е. объединить однаковые стери слово all, остальное оставь) и будет тебе счастье
WildWind (2001-12-07 13:25:00) [6]Вот она, сила привычки... ;)
Значит в лоб никак? Надо промежуточную базу создавать?
Desdechado (2001-12-07 11:23:00) [7]BDE тут ни причем. Это совершенно правильное поведение, описанное в стандарте SQL. А вот Fox использует (придумал?) какой-то недоSQL со своими приколами