powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Переменная и SELECT ?????????????
12 сообщений из 12, страница 1 из 1
Переменная и SELECT ?????????????
    #32011223
MessMaker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Тут наткнулся на непонятное мне поведение SQL - сервер'a
(проверял только для 2000).

Код:
\ndeclare @x int

select @x = x
from (select 1 x
union
select 2 x) t

print @x

Результат: 2


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

\ndeclare @x int

select @x = x
from (select 2 x
union
select 1 x) t

print @x

Результат: 2!!!!!!!!!!!!!!


По ходу берется максимум...

А теперь другая запись:

\ndeclare @x int

set @x = (select x
from (select 1 x
union
select 2 x) t)
Результат:
Server: Msg 512, Level 16, State 1, Line 13
Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.


Ваши комментарии [_________________________]

P.S. У кого есть седьмой SQL, проверьте, пожалуйста на нем...
...
Рейтинг: 0 / 0
Переменная и SELECT ?????????????
    #32011234
Slava
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
set @x = может быть только одному значению
select @x = последнему из запроса
...
Рейтинг: 0 / 0
Переменная и SELECT ?????????????
    #32011257
MessMaker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Это понятно, но не понятно почему последний из запроса - это максимальный элемент?
...
Рейтинг: 0 / 0
Переменная и SELECT ?????????????
    #32011277
Фотография SergSuper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вы пишите такой запрос, результат которого неопределён в принципе. Гадать почему результат этого запроса именно такой - архиглупое занятие.
...
Рейтинг: 0 / 0
Переменная и SELECT ?????????????
    #32011285
Фотография Garya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SergSuper, похоже, поторопился с ответом, до конца не вникнув. Он очень часто использует прием, связанный с использованным в первом примере присваиванием и хорошо знает, как работают подобные конструкции.
А именно - присваивание производится многократно - по количеству записей в выборке. Поскольку записей две, то сначала @x присваивается значение 1, потом 2. После завершения скрипта @x содержит значение последней записи. А попробуй так:
set @x=0
select @x = @x + x
from (select 1 x
union
select 2 x) t

print @x

Получишь сумму, не используя агрегатную функцию. Если ты хочешь присвоить переменной ОДНО значение, то делается это так:
set @x=(select...)
или так:
select @x=(select...)

Что, собсно, и сделано во втором примере, в котором ты и получаешь закономерное сообщение об ошибке.
...
Рейтинг: 0 / 0
Переменная и SELECT ?????????????
    #32011299
MessMaker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Thanks 2 Garya за ясный ответ.

Только, похоже, я совсем тупой.
Если @x присваивается для каждой строки, а на выходе в @x - результат последнего присваивания, то получается, что порядок следования строк в

select 1 x
union
select 2 x

и

select 2 x
union
select 1 x

одинаковый. А я всегда думал, что в подобном случае строки идут в том же порядке, как и в запросе...
...
Рейтинг: 0 / 0
Переменная и SELECT ?????????????
    #32011301
Slava
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
UNION сортирует и делает уникальными записи в таблицах
...
Рейтинг: 0 / 0
Переменная и SELECT ?????????????
    #32011310
MessMaker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не понял мысли относительно сортировки, которую якобы выполняет UNION.
По каким полям он сортирует (по всем выбираемым?)?

\ncreate table #t (id int primary key)

insert #t values (2)
insert #t values (1)

select * from #t
union all
select * from #t

drop table #t


Результат:
id
--
1
2
1
2

Если сделать запрос
select * from #t
,то результатом будет

1
2
, что логично, т.к. для #t создается CLUSTERED индекс.

Если убрать из описания таблицы primary key, то
\nselect * from #t
union all
select * from #t

вернет
id
--
2
1
2
1
, то есть строки идут в порядке добавления.

Тогда, по логике, можно предположить, что
\nselect 1 x
union
select 2 x

создает CLUSTERED index. Так что-ли?
...
Рейтинг: 0 / 0
Переменная и SELECT ?????????????
    #32011314
Фотография SergSuper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 MessMaker
Тут хоть и Garya обвинил, меня что я не вник до конца, но я с ним не согласен и поясню свою точку зрения.
На мой взгляд(просьба не обижаться) Вы занимаетесь ерундой. Такие конструкции(с присваиванием), которые вы пишите, смысла использовать нет.
Да, я (как выразился Garya) "использую(но очень редко) прием, связанный с использованным в первом примере присваиванием", но я знаю, что этот приём "на грани" - порядок в нём гарантировать нельзя, а при использованиии ORDER BY присваивание может быть выполнено только один раз. Почему это происходит - даже не задумывался.
Что касается Ваших изысканий - если нет order by, то порядок записей не определён и они будут выводиться в удобном для SQL-сервера порядке, о котором знают наверное только его разработчики(и то не уверен). Остаётся только смириться с этим. Или писать order by.

С приветом Сергей
...
Рейтинг: 0 / 0
Переменная и SELECT ?????????????
    #32011317
MessMaker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я обычно пишу set @x = (select ...).
Но если надо выбрать несколько полей в несколько переменных?
Приходится использовать select @x = ,...
...
Рейтинг: 0 / 0
Переменная и SELECT ?????????????
    #32011333
Slava
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Конечно же есть разница между union и union all!!!!!!!!!!!!!!!!!!!!!!!!
...
Рейтинг: 0 / 0
Переменная и SELECT ?????????????
    #32011334
Фотография SergSuper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне проще, я узнал что можно присваивать значение переменной через set наверное где-то пол-года назад. Но смысла в этом так и не увидел. Поэтому всегда пишу select @i=0, @k=0
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Переменная и SELECT ?????????????
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]