Форум: "Базы";
Текущий архив: 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
y2
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
Вот какое условие надо ставить первым:
T1.Key1=T2.Ke
y1 или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