Форум: "Базы";
Текущий архив: 2002.10.28;
Скачать: [xml.tar.bz2];
ВнизПоследовательное выполнение Select Найти похожие ветки
← →
Maik (2002-10-07 18:25) [0]Как грамотно организовать в IB5.5+D5
последовательное выполнение
Select * from Table1 .....
затем
Select * from (Первый Select).....
потом
Select * from (Второй Select).....
предложения? ссылки?
← →
Johnmen (2002-10-07 18:30) [1]А что, одним селектом никак ? :-)))
← →
AM (2002-10-07 18:34) [2]
SELECT * FROM ( SELECT * FROM ( SELECT * FROM table1 ) )
это называется вложенные запросы...
← →
Johnmen (2002-10-07 18:37) [3]>AM (07.10.02 18:34)
Не надо, уважаемый ! Это же IB, а не Fox какой-нибудь...
← →
Maik (2002-10-07 19:40) [4]>AM (07.10.02 18:34)
>SELECT * FROM ( SELECT * FROM ( SELECT * FROM table1 ) )
Что не очень работает.
SELECT * FROM ( SELECT * FROM table1 ) записываем в Query
При запуске выдает:
General SQL error.Token unknown - line 1, char 16 select
Ругается на вложенный Select
Уточняю:
Первый Select содержит Union результат 10-ки тысяч записей
Второй Вычисляет Sum по некоторым полям первого: 100-ни записей
Третий просто добавляет кое-что из других таблиц
← →
evgeg (2002-10-07 23:01) [5]Используйте хр. процедуры и for select.
create procedure proc1
returns (A integer, B verchar(100)
as
begin
for select A, B
from Table1 ...
into :A, :B
do
suspend;
end;
create procedure proc2
...
begin
for select A, B from proc1
...
end;
← →
evgeg (2002-10-07 23:03) [6]А наиболее грамотно, возможно, пересмотреть решение вашей задачи. Почему то кажется, что вы пытаетесь решить ее с позиций локальных таблиц, а не SQL-сервера.
← →
Maik (2002-10-07 23:28) [7]>evgeg © (07.10.02 23:01)
Спасибо.
В общем можно действительно пойти по пути хр.процедур,
но хотелось бы найти решение для использования запросов
в Query на клиенте.Построение запроса зависит от
нескольких условий,что влияет на поля выборки и на
условия Group by.(нужно будет очень много хр.процедур)
А в общем проблема сводиться к обработке
Select с Union,необходимо выполнить Group by по всем строкам,посчитать sum
Не думаю,что проблема в подходе.
← →
Наталия (2002-10-08 06:16) [8]>Построение запроса зависит от
>нескольких условий,что влияет на поля выборки и на
>условия Group by.(нужно будет очень много хр.процедур)
В хранимых процедурах есть входные и выходные параметры.
← →
Maik (2002-10-08 09:19) [9]Наталия © (08.10.02 06:16)
>В хранимых процедурах есть входные и выходные параметры
Есть то они есть,но попробуйте с помощью параметров
изменить порядок Group by,или Order By.
Можно конечно, но это уже будут разные Select.
1.Процедура будет громоздкой.
2.Нужно все варианты предусмотреть в хр.процедурах
На клиенте составить необходимый запрос гораздо легче.
Есть еще новые предложения по сути вопроса(без хранимых
процедур)?
← →
Johnmen (2002-10-08 09:24) [10]Предложение - написать одним запросом...
← →
Maik (2002-10-08 10:06) [11]Johnmen © (08.10.02 09:24)
>Предложение - написать одним запросом...
Будьте добры подробнее.
Пример:
Есть Table1 вида (kod1,kod2,summa)
Необходимо посчитать sum(summa) для kod1=5
и sum(summa) для kod2=6 , получить результат в виде
одной строки (kod1,sum1,kod2,sum2)
← →
Johnmen (2002-10-08 10:18) [12]Примерно так :
SELECT
A.kod1,
(SELECT SUM(summa) FROM Table1 B WHERE B.kod1=5) AS S1,
A.kod2,
(SELECT SUM(summa) FROM Table1 B WHERE B.kod2=6) AS S2,
FROM Table1 A
GROUP BY A.kod1, A.kod2
← →
Maik (2002-10-08 10:57) [13]>Johnmen © (08.10.02 10:18)
Не совсем то,что нужно.
Выдает набор строк,группирует по A.kod1, A.kod2
Да и производительность запроса будет низкой,
для каждой строки необходимо вычислять Sum1,Sum2,
а строк там много.
Уточняю:результат типа одной строки (kod1=5,sum1,kod2=6,sum2)
← →
Johnmen (2002-10-08 11:11) [14]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)
← →
Praco (2002-10-08 11:14) [15]>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
← →
Desdechado (2002-10-08 11:18) [16]>Первый Select содержит Union результат 10-ки тысяч записей
И эти десятки тыс. записей тянуть на клиента?!
>Второй Вычисляет Sum по некоторым полям первого: 100-ни записей
Если только по некоторым, тогда зачем остальные поля нужны?
Я бы все равно ХП использовал, даже если их будет много. А вот если надо что-то в виде одной строки сделать, так не обязательно это одним запросом оформлять - можно выбрать из десятка разных запросов или строк в запросе, а потом соединить все это на клиенте в одну строку (уже не датасета) и использовать.
← →
Johnmen (2002-10-08 11:21) [17]>Praco © (08.10.02 11:14)
>А будет ли такой запрос работать?
>ИМХО, не будет, но проверять лениво.
ИМХО, будет, но проверять лениво.
← →
Maik (2002-10-08 11:44) [18]>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:50) [19]>Maik
По поводу быстродействия - если оно не устраивает, то необходимо разумное сочетание ХП (о чем уже говорили) и запросов...
← →
Praco (2002-10-08 12:47) [20]Да, был неправ.
Но у меня не работает запрос - Johnmen © (08.10.02 11:11)
Причем IB просто тихо умирает, клиент выдает сообщение:
"Connection lost .."
Причем всегда, когда использутся подзапрос вместо агрегатной функции при группировке.
IB 4.21
← →
Johnmen (2002-10-08 12:52) [21]>Praco © (08.10.02 12:47)
А если в isql ?
← →
Praco (2002-10-08 13:06) [22]О, в isql сообщение есть.
Программа IBSERVER вызвала сбой при обращении к странице памяти
в модуле IBSERVER.EXE по адресу 0177:004d23da. Умер.
И это не при исполнении, а при prepare.
Наверное, эта возможность появилась в 5.x
← →
Johnmen (2002-10-08 13:20) [23]>Praco © (08.10.02 13:06)
Видимо так и есть...:-)
Пофиксили найденные баги...
← →
Maik (2002-10-08 14:04) [24]Спасибо всем.
Как варианты рассмотриваю.
1.С использованием хр.процедур
2.С импользованием View
Create View
Дальнейшая обработка View с помощью Select
Drop View
Интересует работа с Cursors в IB
Declare Cursor,Open и т.д.
Выношу это в отдельную тему.
← →
Maik (2002-10-08 15:44) [25]>Всем
Ну что за грабли :-(
Пробую решить задачу через хр.процедуры.
Но оказывается в For Select нельзя использовать sum(поле).
И как это обойти.
Нужно на самом деле получить много строк вида
(kod1,sum1,kod2,sum2)
kod1,kod2 могут быть разными (одна строка это для упрощения примера)
Так,что нужно получить набор данных.
← →
Maik (2002-10-08 16:02) [26]Group by тоже не работает.
← →
Johnmen (2002-10-08 16:16) [27]Приведи неработающую ХП и текст ошибки...
← →
Maik (2002-10-08 16:35) [28]
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:54) [29]Группировать надо по всем полям в запросе, которые не агрегатные...
← →
Maik (2002-10-08 17:18) [30]Здорово.:-)
Вроде бы пошло.
← →
Val (2002-10-08 17:34) [31]>Maik (08.10.02 14:04)
вариант со View отметайте однозначно. Это статические метаданные, в IB есть ограничение на количество их изменений до backup/restore(кажется 255).Додропаетесь ;)
← →
kaif (2002-10-09 04:32) [32]Хорошим решением (быстро работающим) тут может оказаться каскадное применение хранимых select процедур.
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2002.10.28;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.008 c