Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Подскажите с массивами?  [new]
GaZone
Member

Откуда:
Сообщений: 67
Задача в следующем: необходимо получить в переменные значения первой и второй строки выборки. На ум сразу пришло воспользоваться массивом, записать результат выборки в массив, а затем оперировать первыми двумя элементами массива. Вот только не где не могу найти пример работы с массивом, как объявить и как присвоить ему результат выборки. Подскажите плз, верное ли решение задачи я выбрал? Ну и короткие примеры синтаксиса. Спасибо.
17 окт 09, 10:50    [7799976]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите с массивами?  [new]
aleks2
Guest
GaZone,
В MS SQL массивы принято называть ТАБЛИЦАМИ. Создай и записывай.

declare @x table(....)
17 окт 09, 11:16    [7799993]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите с массивами?  [new]
GaZone
Member

Откуда:
Сообщений: 67
aleks2
(....)

подразумевает Select?
17 окт 09, 11:32    [7800010]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите с массивами?  [new]
aleks2
Guest
GaZone
aleks2
(....)

подразумевает Select?

BOL читать не обучены?

declare @x table(Field1 in, Field2 varchar(512), и т.д. и т.п.)
17 окт 09, 11:36    [7800012]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите с массивами?  [new]
GaZone
Member

Откуда:
Сообщений: 67
aleks2
BOL читать не обучены?

Знать бы еще что в нем искать...
Все равно не понял, ну объявили мы табличку, как в неё записать результат выборки и как после получить второй элемент таблици?
17 окт 09, 11:40    [7800019]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите с массивами?  [new]
aleks2
Guest
GaZone
aleks2
BOL читать не обучены?

Знать бы еще что в нем искать...
Все равно не понял, ну объявили мы табличку, как в неё записать результат выборки и как после получить второй элемент таблици?


declare @t table(id int identity primary key clustered, Value int)

insert @t(Value)
select 456
union all
select 123

-- первый
select Value from @t WHERE id=1

-- второй
select Value from @t WHERE id=2
17 окт 09, 11:47    [7800028]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите с массивами?  [new]
GaZone
Member

Откуда:
Сообщений: 67
aleks2

declare @t table(id int identity primary key clustered, Value int)

insert @t(Value)
select 456
union all
select 123

-- первый
select Value from @t WHERE id=1

-- второй
select Value from @t WHERE id=2


Спасибо огромное!
17 окт 09, 11:56    [7800038]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите с массивами?  [new]
GaZone
Member

Откуда:
Сообщений: 67
А как очистить такую таблицу?
TRUNCATE TABLE @t
не работает.
17 окт 09, 12:13    [7800058]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите с массивами?  [new]
aleks2
Guest
GaZone
А как очистить такую таблицу?
TRUNCATE TABLE @t
не работает.


DELETE, вестимо. Только зачем?

Вопче отвыкайте мыслить "ПЕРВОЙ и ВТОРОЙ строкой выборки". SQL обрабатывает неупорядоченные НАБОРЫ. Ежели у вас возникает потребность в "ПЕРВОЙ и ВТОРОЙ строке выборки" - выкиньте вашу базу. Она спроектирована неправильно.
17 окт 09, 12:21    [7800070]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите с массивами?  [new]
GaZone
Member

Откуда:
Сообщений: 67
aleks2

DELETE, вестимо. Только зачем?

Вопче отвыкайте мыслить "ПЕРВОЙ и ВТОРОЙ строкой выборки". SQL обрабатывает неупорядоченные НАБОРЫ. Ежели у вас возникает потребность в "ПЕРВОЙ и ВТОРОЙ строке выборки" - выкиньте вашу базу. Она спроектирована неправильно.


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

Вот ради последнего столбца и все эти ухищрения. Возможно есть способы сделать это проще?
17 окт 09, 12:26    [7800076]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите с массивами?  [new]
iljy
Member

Откуда:
Сообщений: 8711
GaZone,

в принципе есть

select @val1 = max(case N when 1 then Size end), @val2 = max(case N when 2 then Size end)
from
(
    select top 2 *, row_number() over(order by date desc) N
    from Table
    order by date desc
)
17 окт 09, 12:34    [7800087]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите с массивами?  [new]
aleks2
Guest
GaZone
aleks2

DELETE, вестимо. Только зачем?

Вопче отвыкайте мыслить "ПЕРВОЙ и ВТОРОЙ строкой выборки". SQL обрабатывает неупорядоченные НАБОРЫ. Ежели у вас возникает потребность в "ПЕРВОЙ и ВТОРОЙ строке выборки" - выкиньте вашу базу. Она спроектирована неправильно.


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

Вот ради последнего столбца и все эти ухищрения. Возможно есть способы сделать это проще?

Можно, впишите в лог ссылку на предыдущую дату при вставке очередной строки.
17 окт 09, 12:37    [7800091]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите с массивами?  [new]
GaZone
Member

Откуда:
Сообщений: 67
aleks2
Можно, впишите в лог ссылку на предыдущую дату при вставке очередной строки.

Тагда уж проще вписывать сразу предыдущий размер.
17 окт 09, 12:39    [7800094]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите с массивами?  [new]
aleks2
Guest
GaZone
aleks2
Можно, впишите в лог ссылку на предыдущую дату при вставке очередной строки.

Тагда уж проще вписывать сразу предыдущий размер.


Это вопрос дискуссионный, а ну как тебе ишо чего потребуется из предыдущего?
17 окт 09, 13:11    [7800151]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите с массивами?  [new]
iljy
Member

Откуда:
Сообщений: 8711
GaZone,

чем мой вариант не подошел? легко расширяется до любого фиксированного N, можно извлечь любое количество полей, что не так?
17 окт 09, 13:13    [7800158]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите с массивами?  [new]
aleks2
Guest
iljy
GaZone,

чем мой вариант не подошел? легко расширяется до любого фиксированного N, можно извлечь любое количество полей, что не так?


Дарагой, запускал ли ты свой вариант на 100000-1000000 записей? Ну дык, запусти и помолчи.
17 окт 09, 13:37    [7800203]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите с массивами?  [new]
iljy
Member

Откуда:
Сообщений: 8711
aleks2

Дарагой, запускал ли ты свой вариант на 100000-1000000 записей? Ну дык, запусти и помолчи.

Дарагой, мой вариант работает на 30млн записей за 2 мс. Не веришь - запусти и помолчи. Быстродействие тут в любом случае упирается в поиск 2 нужных записей, а дальше все отрабатывает мгновенно. Если есть соответствующий индекс - мгновенно отработает весь запрос, если нет - эти записи будут искаться долго по любому.
17 окт 09, 13:44    [7800209]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите с массивами?  [new]
aleks2
Guest
iljy
aleks2

Дарагой, запускал ли ты свой вариант на 100000-1000000 записей? Ну дык, запусти и помолчи.

Дарагой, мой вариант работает на 30млн записей за 2 мс. Не веришь - запусти и помолчи. Быстродействие тут в любом случае упирается в поиск 2 нужных записей, а дальше все отрабатывает мгновенно. Если есть соответствующий индекс - мгновенно отработает весь запрос, если нет - эти записи будут искаться долго по любому.


Не верю. И не поверю.
17 окт 09, 14:05    [7800225]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите с массивами?  [new]
iljy
Member

Откуда:
Сообщений: 8711
aleks2
[quot iljy][quot aleks2]
Не верю. И не поверю.

USE [tempdb]
CREATE TABLE [dbo].[TestT](
	[id] [int] NOT NULL,
	[val] [int] NULL,
 CONSTRAINT [PK_TestT] PRIMARY KEY CLUSTERED 
(
	[id] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
GO

;with CNT as
(select top 30000000 row_number() over(order by (select 1)) N
 from master..spt_values t1, master..spt_values t2, master..spt_values t3
)
insert into TestT
select N, N+1000
from CNT
GO

select max(case N when 1 then val end), max(case N when 2 then val end)
from
(
    select top 2 *, row_number() over(order by id desc) N
    from TestT
    order by id desc
) t
а с самолюбованием таки пора завязывать. Дарагой.
17 окт 09, 14:07    [7800226]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите с массивами?  [new]
aleks2
Guest
А теперь, сделай это же "не для последних двух".
17 окт 09, 14:10    [7800233]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите с массивами?  [new]
iljy
Member

Откуда:
Сообщений: 8711
aleks2,
select max(case N when 1 then val end), max(case N when 2 then val end), 
max(case N when 3 then val end), max(case N when 4 then val end)
from
(
    select top 4 *, row_number() over(order by id desc) N
    from TestT
    order by id desc
) t
для 4. Время то же самое.
17 окт 09, 14:14    [7800239]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите с массивами?  [new]
aleks2
Guest
iljy
aleks2,
select max(case N when 1 then val end), max(case N when 2 then val end), 
max(case N when 3 then val end), max(case N when 4 then val end)
from
(
    select top 4 *, row_number() over(order by id desc) N
    from TestT
    order by id desc
) t
для 4. Время то же самое.

Объясним популярно:
0. top 4 отличается от top 2 НИЧЕМ. Ты уж заряди TOP 15000000.
1. Выдрать для одиночной записи предшествующую - это быстро.
2. Тормоза начинаются когда надо для множества записей сделать эту самую операцию.
3. Тута твой способ применить затруднительно.
17 окт 09, 14:25    [7800252]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите с массивами?  [new]
iljy
Member

Откуда:
Сообщений: 8711
GaZone
Задача в следующем: необходимо получить в переменные значения первой и второй строки выборки.

Ну да ладно.
aleks2

Объясним популярно:
0. top 4 отличается от top 2 НИЧЕМ. Ты уж заряди TOP 15000000.
1. Выдрать для одиночной записи предшествующую - это быстро.
2. Тормоза начинаются когда надо для множества записей сделать эту самую операцию.
3. Тута твой способ применить затруднительно.

А теперь объясни мне "популярно", почему в твоем понимании выборка записей во временную таблицу будет сильно быстрее в том же самом случае. И лучше с примером кода.
17 окт 09, 14:29    [7800257]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите с массивами?  [new]
iljy
Member

Откуда:
Сообщений: 8711
aleks2,

а заодно уж выполни вот такой запрос:
select top 10000 t1.id, t1.val, t2.val prevval
from TestT t1
	outer apply
(
	select top 1 *
	from TestT
	where id < t1.id
	order by id desc
) t2
17 окт 09, 14:32    [7800263]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить