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

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

Последовательное выполнение Select [D5, IB5.x]


Страницы:   1 2

Maik ©   (2002-10-07 18:25:00) 

Как грамотно организовать в IB5.5+D5
последовательное выполнение
Select * from Table1 .....
затем
Select * from (Первый Select).....
потом
Select * from (Второй Select).....

предложения? ссылки?


kaif   (2002-10-09 04:32:00) [1]

Хорошим решением (быстро работающим) тут может оказаться каскадное применение хранимых select процедур.


Val   (2002-10-08 17:34:00) [2]

>Maik (08.10.02 14:04)
вариант со View отметайте однозначно. Это статические метаданные, в IB есть ограничение на количество их изменений до backup/restore(кажется 255).Додропаетесь ;)


Maik   (2002-10-08 17:18:00) [3]

Здорово.:-)
Вроде бы пошло.


Johnmen   (2002-10-08 16:54:00) [4]

Группировать надо по всем полям в запросе, которые не агрегатные...


Maik   (2002-10-08 16:35:00) [5]

CREATE PROCEDURE OBSV2
RETURNS (
KOD10 INTEGER,
SUM10 NUMERIC(15, 3),
KOD20 INTEGER,
SUM20 NUMERIC(15, 3)
)
AS
begin
For Select kod1,sum(sum1),kod2,sum2 from obsv1
into :KOD10,:SUM10,:KOD20,:SUM20
do
begin
suspend;
end

end


При компиляции.
Invalid token.Dynamic SQL Error.
SQL error code = -104.invalid column reference

Стоит убрать sum() все работает,
такая же ошибка при Gropup by kod1


Johnmen   (2002-10-08 16:16:00) [6]

Приведи неработающую ХП и текст ошибки...


Maik   (2002-10-08 16:02:00) [7]

Group by тоже не работает.


Maik   (2002-10-08 15:44:00) [8]

>Всем
Ну что за грабли :-(
Пробую решить задачу через хр.процедуры.
Но оказывается в For Select нельзя использовать sum(поле).

И как это обойти.
Нужно на самом деле получить много строк вида
(kod1,sum1,kod2,sum2)
kod1,kod2 могут быть разными (одна строка это для упрощения примера)
Так,что нужно получить набор данных.


Maik   (2002-10-08 14:04:00) [9]

Спасибо всем.

Как варианты рассмотриваю.
1.С использованием хр.процедур
2.С импользованием View
Create View
Дальнейшая обработка View с помощью Select
Drop View

Интересует работа с Cursors в IB
Declare Cursor,Open и т.д.
Выношу это в отдельную тему.


Johnmen   (2002-10-08 13:20:00) [10]

>Praco © (08.10.02 13:06)

Видимо так и есть...:-)
Пофиксили найденные баги...


Praco   (2002-10-08 13:06:00) [11]

О, в isql сообщение есть.

Программа IBSERVER вызвала сбой при обращении к странице памяти
в модуле IBSERVER.EXE по адресу 0177:004d23da. Умер.

И это не при исполнении, а при prepare.

Наверное, эта возможность появилась в 5.x


Johnmen   (2002-10-08 12:52:00) [12]

>Praco © (08.10.02 12:47)

А если в isql ?


Praco   (2002-10-08 12:47:00) [13]

Да, был неправ.
Но у меня не работает запрос - Johnmen © (08.10.02 11:11)
Причем IB просто тихо умирает, клиент выдает сообщение:
"Connection lost .."
Причем всегда, когда использутся подзапрос вместо агрегатной функции при группировке.
IB 4.21


Johnmen   (2002-10-08 11:50:00) [14]

>Maik

По поводу быстродействия - если оно не устраивает, то необходимо разумное сочетание ХП (о чем уже говорили) и запросов...


Maik   (2002-10-08 11:44:00) [15]

>Johnmen © (08.10.02 11:11)
Спасибо действительно работает.
Но производительность под вопросом.
Проверить не начем.Но вообще каждый Sum должен обработать
10-ки тысяч записей,а сама Table1 содержит 100-ни тысяч
Серверу придется выполнить много работы ради простого результата

>Praco © (08.10.02 11:14)
Ваш вариант не работает.
Все равно необходимо добавлять:
GROUP BY A.kod1, A.kod2
HAVING (A.kod1=5) AND (A.kod2=6)

>Desdechado © (08.10.02 11:18)
>И эти десятки тыс. записей тянуть на клиента?!
Да не хотелось бы на клиенте.

>Если только по некоторым, тогда зачем остальные поля нужны?
для добавления данных из других таблиц но уже к результату


Да в общем простая была идея:
Сначала сделать нужную выборку,потом проссумировать,потом добавить что нужно.



Johnmen   (2002-10-08 11:21:00) [16]

>Praco © (08.10.02 11:14)
>А будет ли такой запрос работать?
>ИМХО, не будет, но проверять лениво.

ИМХО, будет, но проверять лениво.


Desdechado   (2002-10-08 11:18:00) [17]

>Первый Select содержит Union результат 10-ки тысяч записей
И эти десятки тыс. записей тянуть на клиента?!

>Второй Вычисляет Sum по некоторым полям первого: 100-ни записей
Если только по некоторым, тогда зачем остальные поля нужны?

Я бы все равно ХП использовал, даже если их будет много. А вот если надо что-то в виде одной строки сделать, так не обязательно это одним запросом оформлять - можно выбрать из десятка разных запросов или строк в запросе, а потом соединить все это на клиенте в одну строку (уже не датасета) и использовать.


Praco   (2002-10-08 11:14:00) [18]

>Johnmen © (08.10.02 10:18)
А будет ли такой запрос работать? Ведь при группировке в разделе FROM может стоять только имя поля(продублированное в GROUP BY) или агрегатная функция. В вашем случае ни то ни другое, а вложенный подзапрос. ИМХО, не будет, но проверять лениво.

>Maik
Одной строкой так:

SELECT
5 as kod1,
(SELECT SUM(summa) FROM Table1 B WHERE B.kod1=5) AS S1,
6 as kod2,
(SELECT SUM(summa) FROM Table1 B WHERE B.kod2=6) AS S2,
FROM Table1 A


Johnmen   (2002-10-08 11:11:00) [19]

SELECT
A.kod1,
(SELECT SUM(summa) FROM Table1 B WHERE B.kod1=5) AS S1,
A.kod2,
(SELECT SUM(summa) FROM Table1 C WHERE C.kod2=6) AS S2,
FROM Table1 A
GROUP BY A.kod1, A.kod2
HAVING (A.kod1=5) AND (A.kod2=6)


Maik   (2002-10-08 10:57:00) [20]

>Johnmen © (08.10.02 10:18)
Не совсем то,что нужно.
Выдает набор строк,группирует по A.kod1, A.kod2

Да и производительность запроса будет низкой,
для каждой строки необходимо вычислять Sum1,Sum2,
а строк там много.

Уточняю:результат типа одной строки(kod1=5,sum1,kod2=6,sum2)



Страницы:   1 2

Наверх

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