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

Откуда:
Сообщений: 129
Есть данные:
declare @t table (sub_num smallint)
declare @s table ([name] varchar(20))

insert into @t values (1),(15),(24)
insert into @s values ('M'), ('V'), ('S')


Необходимо написать запрос, чтобы возвращал данные. Курсоры не предлагать.

namesub_num
M1
V15
S24
6 мар 14, 12:05    [15681625]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать запрос  [new]
Glory
Member

Откуда:
Сообщений: 104760
Нумеруте каждый набор. И соединяете по этому номеру
6 мар 14, 12:06    [15681632]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать запрос  [new]
Новопашин Владимир
Member

Откуда:
Сообщений: 129
Glory
Нумеруте каждый набор. И соединяете по этому номеру


А как?
6 мар 14, 12:07    [15681637]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать запрос  [new]
Новопашин Владимир
Member

Откуда:
Сообщений: 129
Glory
Нумеруте каждый набор. И соединяете по этому номеру


Добавлять поля в таблички нельзя. Решать надо эту задачу без добавления полей.
6 мар 14, 12:08    [15681647]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать запрос  [new]
Glory
Member

Откуда:
Сообщений: 104760
Новопашин Владимир
Glory
Нумеруте каждый набор. И соединяете по этому номеру


А как?

функцией row_number()
6 мар 14, 12:08    [15681649]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать запрос  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
Новопашин Владимир,

да никак. У Вас же нет поля, задающего порядок записей в таблицах?
6 мар 14, 12:08    [15681653]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать запрос  [new]
Новопашин Владимир
Member

Откуда:
Сообщений: 129
Glory
Новопашин Владимир
пропущено...


А как?

функцией row_number()


Спасибо за совет. Получился такой запросик (ниже), который решил мою задачу:

declare @t table (sub_num smallint)
declare @s table (name varchar(20))
insert into @t values (1),(15),(24)

insert into @s values ('M'), ('V'), ('S')

select s.name , t.sub_num  from (
select row_number() over (order by sub_num) as id , sub_num from @t) t
inner join
(select row_number() over (order by name) as id , name from @s) s on t.id = s.id 
6 мар 14, 12:13    [15681689]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать запрос  [new]
Glory
Member

Откуда:
Сообщений: 104760
Новопашин Владимир
который решил мою задачу:

он решил только частный случай когда число записей в обеих таблицах строго равно.
6 мар 14, 12:14    [15681702]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать запрос  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
Glory
Новопашин Владимир
который решил мою задачу:

он решил только частный случай когда число записей в обеих таблицах строго равно.
Вообще ничего не решил, поскольку выдаст записи @s, упорядоченные по алфавиту,
а это вовсе не то, что требовалось!
Требовалось пронумеровать их в порядке вставки в таблицу, а это невозможно!
6 мар 14, 12:26    [15681829]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать запрос  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7871
Новопашин Владимир, эта задача в принципе не решается гарантированно, т.к. Вы не указываете номера записи при сохранении.
6 мар 14, 13:01    [15682121]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать запрос  [new]
Новопашин Владимир
Member

Откуда:
Сообщений: 129
iap
Glory
пропущено...

он решил только частный случай когда число записей в обеих таблицах строго равно.
Вообще ничего не решил, поскольку выдаст записи @s, упорядоченные по алфавиту,
а это вовсе не то, что требовалось!
Требовалось пронумеровать их в порядке вставки в таблицу, а это невозможно!


Я получил результат

name sub_num
M1
V15
S24


это и требовалось
6 мар 14, 13:02    [15682135]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать запрос  [new]
ROLpogo
Member

Откуда: Реутов
Сообщений: 216
Новопашин Владимир
Я получил результат

name sub_num
M1
V15
S24


это и требовалось


Это что за кодировка, при которой V идет перед S?
6 мар 14, 13:11    [15682217]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать запрос  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7871
Новопашин Владимир
iap
пропущено...
Вообще ничего не решил, поскольку выдаст записи @s, упорядоченные по алфавиту,
а это вовсе не то, что требовалось!
Требовалось пронумеровать их в порядке вставки в таблицу, а это невозможно!


Я получил результат

name sub_num
M1
V15
S24


это и требовалось

Этот результат Вы получили только для трех значений и практически при нулевой работе оптимизатора.
6 мар 14, 13:15    [15682281]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать запрос  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7871
Автор лукавит, т.к. запрос, который он привел, ожидаемо возвращает
M	1
S 15
V 24
6 мар 14, 13:23    [15682350]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать запрос  [new]
Новопашин Владимир
Member

Откуда:
Сообщений: 129
Владислав Колосов
Автор лукавит, т.к. запрос, который он привел, ожидаемо возвращает
M	1
S 15
V 24


Да вы правы. Мне нужно было чтобы для каждого нового значения из одной таблицы выбиралось значение из другой. Я на порядок сортировки не посмотрел.
6 мар 14, 13:34    [15682447]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать запрос  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7871
Если размер данных не превышает размер страницы базы данных (8 килобайт), то они будут получены по очереди вставки. Т.е. простой селект без сортировки вернет их в порядке добавления.
6 мар 14, 13:48    [15682573]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать запрос  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37069
Владислав Колосов
Если размер данных не превышает размер страницы базы данных (8 килобайт), то они будут получены по очереди вставки. Т.е. простой селект без сортировки вернет их в порядке добавления.
Чушь.

if object_id('tempdb..#t') is not null
    drop table #t
go
create table #t ( id int )

insert #t select 1
insert #t select 2
insert #t select 3
delete a from #t a where a.id = 2
insert #t select 4

select * from #t

id
-----------
1
4
3


Сообщение было отредактировано: 6 мар 14, 13:52
6 мар 14, 13:51    [15682595]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать запрос  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7871
delete здесь причем? Автор что-то собирается удалять?
6 мар 14, 15:06    [15683244]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать запрос  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
Владислав Колосов
delete здесь причем? Автор что-то собирается удалять?
А если Microsoft что-то в сервере поменяет,
и Ваше утверждение будет абсолютно неверным, в суд подадите?
6 мар 14, 15:12    [15683309]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать запрос  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37069
Владислав Колосов
delete здесь причем? Автор что-то собирается удалять?
При том, что он показывает то, что ваше утверждение не верное.
6 мар 14, 15:17    [15683373]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать запрос  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
Владислав Колосов,

Даже можно и не менять ничего, есть ведь allocation order scan, merry-go-round scan, все это не гарантирует возврат в порядке вставки.

Вообще что считать "порядком вставки", данные таблицы могут быть "размазаны" по файлу данных как угодно, добавляемая строка может добавиться как в конец файла, так и в начало, а сама строка не хранит информацию о том, какой по счету она была добавлена.

Много раз уже на форуме обсуждались все эти эффекты, поиском можно найти - вывод один, никакого порядка без order by не гарантируется.
6 мар 14, 15:23    [15683444]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать запрос  [new]
ROLpogo
Member

Откуда: Реутов
Сообщений: 216
Новопашин Владимир
Добавлять поля в таблички нельзя. Решать надо эту задачу без добавления полей.

Если можно добавлять триггеры к этим таблицам и создавать другие таблицы, то можно извратиться и решить вашу задачку, при условии, что данные в обоих таблицах уникальные.
6 мар 14, 15:23    [15683452]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать запрос  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7871
Гавриленко Сергей Алексеевич
Владислав Колосов
delete здесь причем? Автор что-то собирается удалять?
При том, что он показывает то, что ваше утверждение не верное.

Почему неверное? Вы выхватили ответ из контекста темы и показали, что в общем случае утверждение не верно (что логично). Разве мое утверждение будет неверным в контексте кода, который привел автор (задача была сформулирована именно в таком виде):
declare @t table (sub_num smallint)
declare @s table ([name] varchar(20))

insert into @t values (1),(15),(24)
insert into @s values ('M'), ('V'), ('S')
?

Из того, что я написал следует, что задачу можно решить, например, так:
select identity(int,1,1) id, * into #t1 from @t
select identity(int,1,1) id,* into #t2 from @s
select sub_num, name from #t1 join #t2 on #t1.id = #t2.id
6 мар 14, 16:19    [15683900]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать запрос  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37069
Владислав Колосов
Гавриленко Сергей Алексеевич
пропущено...
При том, что он показывает то, что ваше утверждение не верное.

Почему неверное? Вы выхватили ответ из контекста темы и показали, что в общем случае утверждение не верно (что логично). Разве мое утверждение будет неверным в контексте кода, который привел автор (задача была сформулирована именно в таком виде):
declare @t table (sub_num smallint)
declare @s table ([name] varchar(20))

insert into @t values (1),(15),(24)
insert into @s values ('M'), ('V'), ('S')

?

Из того, что я написал следует, что задачу можно решить, например, так:
select identity(int,1,1) id, * into #t1 from @t
select identity(int,1,1) id,* into #t2 from @s
select sub_num, name from #t1 join #t2 on #t1.id = #t2.id
Задача автора не имеет решения, даже если сейчас кажется, что это не так. При условии, конечно, что мы мы обсуждаем ее в контексте MSSQL.
6 мар 14, 16:28    [15683977]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить