Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.10.28;
Скачать: CL | DM;

Вниз

Последовательное выполнение 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;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.017 c
3-92396
zdn
2002-10-08 14:41
2002.10.28
---|Ветка была без названия|---


1-92419
Vadim SA
2002-10-16 16:35
2002.10.28
Текст и цвет


1-92476
Acidy
2002-10-18 11:52
2002.10.28
Wise Install Master...


3-92399
Lameruga
2002-10-05 11:56
2002.10.28
MSOfficce + Delphi


14-92667
Jumbot
2002-10-05 20:08
2002.10.28
СРОЧНО!!! HELP ME!!! SOS!!!