Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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.007 c
3-92343
dma
2002-10-06 19:11
2002.10.28
Rave отчеты


4-92776
AddMean
2002-09-11 01:45
2002.10.28
Help: Как с помощью API Узнать номера занимаемых файлом кластеров


1-92532
MV-GROB
2002-10-15 20:39
2002.10.28
не работает последняя функция


1-92519
vilfred
2002-10-18 17:25
2002.10.28
как передать и принять массив в функцию(процедуру)? +


1-92610
borg
2002-10-17 13:53
2002.10.28
открыть файл





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский