Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2004.01.05;
Скачать: [xml.tar.bz2];

Вниз

Как сохранить результаты запроса в переменных?   Найти похожие ветки 

 
Bless   (2003-12-05 15:38) [0]

Есть запрос приблизительно следующего вида:
SELECT SUM(a), SUM(b) FROM ...
Если бы запрос возвращал одно значение, можно было бы сделать
SET @x=(SELECT SUM(a) FROM...).
А если мне надо оба возвращенных значения сохранить в двух переменных?
То есть что-то вроде SELECT @x=SUM(a), @y=SUM(b) FROM ...
Это возможно как-то сделать?


 
Плохиш_   (2003-12-05 15:49) [1]

SELECT SUM(a) as x, SUM(b) as y FROM ...

не помогло?


 
Anatoly Podgoretsky   (2003-12-05 15:50) [2]

Fields[0], Fields[1], ...


 
Bless   (2003-12-05 16:29) [3]

>не помогло?

А должно было?
Ведь в твоей предложении x, y - просто имена столбцов в результирующеь запросе. А мне надо именно в переменных все сохранить, чтобы потом с ними дальше работать.

>Fields[0], Fields[1], ..

Мне надо не в Делфи, а в хп


 
Bless   (2003-12-05 16:29) [4]

>не помогло?

А должно было?
Ведь в твоей предложении x, y - просто имена столбцов в результирующеь запросе. А мне надо именно в переменных все сохранить, чтобы потом с ними дальше работать.

>Fields[0], Fields[1], ..

Мне надо не в Делфи, а в хп


 
Ega23   (2003-12-05 16:37) [5]

Declare @X int, @Y int
Set NoCount ON

Select @X=SUM(a) FROM...
Select @Y=SUM(b) FROM...

-- Здесь делаешь что хошь с @X, @Y

Set NoCount OFF

Select X=@X, Y=@Y

Return(0)


 
Silver Alex   (2003-12-05 16:38) [6]

declare x numeric(18,4)
declare y numeric(18,4)

SELECT x=SUM(a), y=SUM(b) FROM ...

это в MS SQL


 
Silver Alex   (2003-12-05 16:39) [7]


> Silver Alex © (05.12.03 16:38) [6]

конечно везде @x, @y


 
Bless   (2003-12-05 16:55) [8]

> Silver Alex ©

Вот блин. А было SELECT x=SUM(a) AS st, y=SUM(b) FROM ...
и не работало! Все из-за AS.
Спасибо.

P.S. А как вы делаете текст наклонным? А то у меня как-то один раз получилось и больше никак. Это от броузера не зависит?


 
Bless   (2003-12-05 17:02) [9]

Кстати, эта возможность (SELECT @X=sum(), @y=sum...)никак не отображена в BOL или я так плохо смотрел? Если плохо смотрел, ткните носом, плз.


 
Ega23   (2003-12-05 17:13) [10]

SELECT @local_variable (T-SQL)

Самое первое в Указателе на Select стоит


 
Bless   (2003-12-05 17:19) [11]

Это не то, насколько я понимаю.
Там эта возможнось не описана. Там только такая:
select @x=(select sum(a) from tab1), @y=(select sum(b) from tab1)


 
Ega23   (2003-12-05 17:23) [12]

Там вот что в самом начале стоит:
SELECT {@local_variable = expression } [,...n]


 
Ega23   (2003-12-05 17:24) [13]

А это select @x=(select sum(a) from tab1), @y=(select sum(b) from tab1)


 
Ega23   (2003-12-05 17:25) [14]

Промазал, сорри....

А это:
select @x=(select sum(a) from tab1), @y=(select sum(b) from tab1)
фигня какая-то...


 
Bless   (2003-12-05 17:50) [15]

>фигня какая-то...

Почему фигня? Как раз согласно предложенному там синтаксису.
expression={...|(scalar_subquery)|...}

>Там вот что в самом начале стоит:
>SELECT {@local_variable = expression } [,...n]

Ну тогда покажи мне, что в запросе

SELECT @x=sum(a),@y=sum(b) FROM table1

является expression?


 
Ega23   (2003-12-05 18:06) [16]


> Bless (05.12.03 17:50) [15]

Не, ты не понял. Вот смотри:

SELECT @x=sum(a),@y=sum(b) FROM table1
Здесь безусловно expression для @x это Sum(a), а для @y - Sum(b).

Но ты написал:
select @x=(select sum(a) from tab1), @y=(select sum(b) from tab1)


 
Ega23   (2003-12-05 18:09) [17]

ЗАРРАЗА, ОПЯТЬ НЕ ТУ КНОПКУ НАЖАЛ!!!

> Bless (05.12.03 17:50) [15]

Не, ты не понял. Вот смотри:

SELECT @x=sum(a),@y=sum(b) FROM table1Здесь безусловно expression для @x это Sum(a), а для @y - Sum(b).

Но ты написал:
select
@x=(select sum(a) from tab1),
@y=(select sum(b) from tab1)

А что дальше? Первый Select к чему относится? From что?
Да и вообще Sum это аггрегатная функция. Бывает, что быстрее будет работать не
SELECT @x=sum(a),@y=sum(b) FROM table1,
а
SELECT @x=sum(a) FROM table1
SELECT @y=sum(b) FROM table1


 
Bless   (2003-12-08 09:28) [18]

>SELECT @x=sum(a),@y=sum(b) FROM table1Здесь безусловно
>expression
>для @x это Sum(a), а для @y - Sum(b).

Если так, то где в синтаксисе
"SELECT {@local_variable = expression } [,...n]"
место для слов "FROM table1"?

>А что дальше? Первый Select к чему относится? From что?

FROM tab1.
Там же написино. tab1 - таблица. Не понимаю, что не так.
Я ведь привел цитату из хелпа:
expression={...|(scalar_subquery)|...}
То бишь, expression может быть запросом, возвращающим единственное значение.
В моем примере expression=(select sum(a) from tab1)

>Да и вообще Sum это аггрегатная функция. Бывает, что быстрее
>будет работать не
>SELECT @x=sum(a),@y=sum(b) FROM table1,

>SELECT @x=sum(a) FROM table1
>SELECT @y=sum(b) FROM table1

А вот за это спасибо. Никогда бы не подумал. Интересно, если так. Хотя, слова "потому что" были бы очень кстати.


 
Shirson   (2003-12-08 09:44) [19]

Ega23 (05.12.03 18:09) [17]
Да и вообще Sum это аггрегатная функция. Бывает, что быстрее будет работать не
SELECT @x=sum(a),@y=sum(b) FROM table1,
а
SELECT @x=sum(a) FROM table1
SELECT @y=sum(b) FROM table1


Хмм.... Заподозрил неладное (с какого это перепугу, два раздельных select, самых временноёмких операции, будут работать быстрее чем одна?)
Взял все три запроса и прогнал в аналайзере, с включенным Execution Plan.
Времязатраты расспределились между запросами так:

SELECT @x=sum(a) FROM table1 - 33%
SELECT @y=sum(b) FROM table1 - 33%
SELECT @x=sum(a),@y=sum(b) FROM table1 - 33%

Соответственно, сам select занял 98% времени, агрегатка - 2% времени у каждого.

Отсюда можно сделать вывод, что выбор двух сумм разом в два раза быстрее, чем выбор их по отдельности. Т.е. с точностью до наоборот, от того что ты сказал :)


 
Shirson   (2003-12-08 09:54) [20]

(точнее, 98% времени заняло TableScan, который делается перед каждым select)


 
Ega23   (2003-12-08 09:54) [21]


> FROM tab1.
> Там же написино. tab1 - таблица. Не понимаю, что не так.
>
> Я ведь привел цитату из хелпа:
> expression={...|(scalar_subquery)|...}
> То бишь, expression может быть запросом, возвращающим единственное
> значение.
> В моем примере expression=(select sum(a) from tab1)


Получается следующее:
select
(
@x=(select sum(a) from tab1),
@y=(select sum(b) from tab1)
)
from Tab1

Зачем такая вложенность?

>А вот за это спасибо. Никогда бы не подумал. Интересно, если так. Хотя, слова "потому что" были бы очень кстати.

Да просто смотреть надо: сколько записей в таблице, какие индексы, что за типы a и b. Короче, ты попробуй и так и так и засеки время выполнения.


 
Shirson   (2003-12-08 09:59) [22]

Ega23
Получается следующее:
select
(
@x=(select sum(a) from tab1),
@y=(select sum(b) from tab1)
)
from Tab1
Зачем такая вложенность?


Не получается :)


 
Ega23   (2003-12-08 10:01) [23]


> Shirson © (08.12.03 09:54) [20]

Ага, а если a и b не поля, а функции? А если Sum идет не из одной таблицы?
ИМХО, смотреть по ситауции надо.
Лучше сорок раз по разу, чем один раз сорок раз! :-)


 
Shirson   (2003-12-08 10:04) [24]

Неважно.
Поставил такие условия, что время распределилось
41.63
16.74
41.63
соответственно.

При любом раскладе, единичный table scan быстрее двойного.


 
Ega23   (2003-12-08 10:06) [25]


> Shirson © (08.12.03 09:59) [22]
> Ega23
> Получается следующее:
> select
> (
> @x=(select sum(a) from tab1),
> @y=(select sum(b) from tab1)
> )
> from Tab1
> Зачем такая вложенность?
>
> Не получается :)

А зачем последний FROM?


 
Ega23   (2003-12-08 10:09) [26]


> Неважно.
> Поставил такие условия, что время распределилось
> 41.63
> 16.74
> 41.63
> соответственно.
>
> При любом раскладе, единичный table scan быстрее двойного.


Всё может быть. Может в таблице всего 100 записей - тогда и спор бепредметный. А бывает, что запрос с тремя вложенными курсорами, да ещё с GROUP BY и ещё с чем-нить. Вот тогда и начинаешь оптимизировать


 
Shirson   (2003-12-08 10:17) [27]

Я брал из таблицы с 10343215 записей.

Потом решил еще и статистику посмотреть. Взял таблицу поменьше (26670 записей)

Тут дела забавные.
Подряд прогнал одну и туже связку есколько раз.
В Execution Plan на каждый запрос cost остался прежним.
А вот со статистикой чёрт знает что.
Три параметра - Продолжительность, Занятость CPU и Количество чтений устроили такую круговоеть...
Один из результатов показал, что
@y=(select sum(b) from tab1) занимает в два раза больше времени чем @y=(select sum(b) from tab1). Потом они равны, потом наоборот. И так далее.
Запрос не менялся. Таблица, вроде тоже.
Вот и пойми теперь, что подразумевается под cost в Execution Plan


 
Shirson   (2003-12-08 10:19) [28]

не @y=(select sum(b) from tab1), а @x=(select sum(a) from tab1)
Ачепятался.


 
Ega23   (2003-12-08 10:29) [29]

Да это вообще дело темное. Взять хотя-бы MSSQL-ную оптимизацию запроса:
Select
T1.Value1, T1.Value2,
T2.Value1, T2.Value2,
T3.Value1, T3.Value2
From Table1 T1, Table2 T2, Table3 T3
Where
T1.Key1=T2.Key1 and T2.Key2=T3.Ke
y2

Вот какое условие надо ставить первым:
T1.Key1=T2.Key1 или T2.Key2=T3.Key2 ?
Вроде как серваку без разницы - он сам его соптимизирует. Но с точки зрения логики разница есть.


 
Stas   (2003-12-08 10:34) [30]

Set @x=(SELECT SUM(a) FROM ...)
Set @y=(SELECT SUM(b) FROM ...)


 
Shirson   (2003-12-08 10:38) [31]

>Stas © (08.12.03 10:34) [30]
>Set @x=(SELECT SUM(a) FROM ...)
>Set @y=(SELECT SUM(b) FROM ...)


Еще хуже. Добавляется два шага: Constant Scan и Nested Loop/Inner Join на каждый запрос



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2004.01.05;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.52 MB
Время: 0.012 c
4-12209
Duncann
2003-11-04 11:37
2004.01.05
не получается послать сообщение другому приложению.


14-12097
tics
2003-12-15 11:23
2004.01.05
Заодированный доступ к папке


3-11772
peypivo
2003-12-09 18:12
2004.01.05
TDbgrid


3-11838
Tornado
2003-12-08 09:10
2004.01.05
Существует ли таблица?


1-11933
-=DeMoH=-
2003-12-19 23:18
2004.01.05
Delphi VS MathCAD





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский