![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Последовательное выполнение Select [D5, IB5.x]
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)