Q&A: Set и Select
От: Дмитрий Полюдов Россия  
Дата: 26.11.03 14:31
Оценка: 130 (6) -1
Статья:
Q&A: Set и Select
Автор(ы): Дмитрий Полюдов

Q. Хотелось бы узнать есть ли принципиальная разница между этими двумя путями. И если есть, то какая?
A. Разница есть. но незначительная.


Авторы:
Дмитрий Полюдов

Аннотация:
Q. Хотелось бы узнать есть ли принципиальная разница между этими двумя путями. И если есть, то какая?
A. Разница есть. но незначительная...

— сколько программистов надо чтобы заменить сгоревшую лампочку?
— сколько не бери, а лампочку не поменять — проблема аппаратная, программным путем не решается...
Re: Q&A: Set и Select
От: KGP http://kornilow.newmail.ru
Дата: 27.11.03 06:28
Оценка:
Здравствуйте, Дмитрий Полюдов, Вы писали:

Что это за цикл? С чем его едят?
select 
  @st = @st + <field>
from <table>
... << RSDN@Home 1.1 beta 2 >>
Re[2]: Q&A: Set и Select
От: Sinclair Россия https://github.com/evilguest/
Дата: 27.11.03 06:51
Оценка: -1
Здравствуйте, KGP, Вы писали:
KGP>Что это за цикл? С чем его едят?
с удовольствием. Работает быстрее, чем склеивание данных через курсор.
... << RSDN@Home 1.1 beta 2 >>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[2]: Q&A: Set и Select
От: _MarlboroMan_ Россия  
Дата: 27.11.03 06:53
Оценка: 7 (2)
Здравствуйте, KGP, Вы писали:

KGP>Что это за цикл? С чем его едят?


пример:
а вот я хочу программно построить запрос к некоторой таблице, который вернет мне только поля некоторого типа.

declare @table_name varchar(128)
declare @type_name varchar(128)
set @table_name = '_main'
set @type_name = 'int'


declare @st varchar(8000)

----------------------------------------------
-- это мой цикл:
set @st = 'select '
select @st = @st + sc.name + ', ' from syscolumns sc
inner join sysobjects  so on lower(so.name) = lower(@table_name) and so.id = sc.id
inner join systypes st on st.xusertype = sc.xusertype and lower(@type_name) = lower(st.name)

----------------------------------------------
-- а это тоже самое с использованием курсора:
declare @name varchar(128)
set @st = 'select '

DECLARE cur CURSOR FOR 
select sc.name
from syscolumns sc
inner join sysobjects  so on lower(so.name) = lower(@table_name) and so.id = sc.id
inner join systypes st on st.xusertype = sc.xusertype and lower(@type_name) = lower(st.name)

OPEN cur
FETCH NEXT FROM cur INTO @name

WHILE @@FETCH_STATUS = 0
BEGIN
    set @st = @st + sc.name + ', ' 
    FETCH NEXT FROM cur INTO @name
END

CLOSE cur
DEALLOCATE cur
----------------------------------------------

set @st = left(@st, len(@st)-1) + ' from ' + @table_name

print @st
exec (@st)
... << RSDN@Home 1.1 beta 2 >>

— сколько программистов надо чтобы заменить сгоревшую лампочку?
— сколько не бери, а лампочку не поменять — проблема аппаратная, программным путем не решается...
Re: Q&A: Set и Select
От: Аноним  
Дата: 15.07.07 10:05
Оценка:
Здравствуйте, Дмитрий Полюдов, Вы писали:

Конструкция
set @id = (select id from <table> )

обломится, если в возвращенном наборе данных больше 1 записи, а select – сработает, да и читается (по моему мнению) select попроще.

а что мешает добавить "top 1"?
самое интересное то, что констукция с select, без указания top 1 вернет последнее значение

declare @id int
declare @table table( id int identity primary key, field varchar(4) )

insert into @table (field)
            select 'AAAA'
union all    select 'BBBB'
union all    select 'CCCC'
union all    select 'BBBB'
union all    select 'AAAA'

set @id = (select top 1 id from @table where field = 'AAAA')
print @id
select  @id = id from @table where field = 'AAAA'
print @id
select top 1 @id = id from @table where field = 'AAAA'
print @id

результат:
1
5
1
Re: Q&A: Set и Select
От: MasterZiv СССР  
Дата: 16.07.07 08:59
Оценка:
Здравствуйте, Дмитрий Полюдов, Вы писали:

4 и 5 неверно.

Одно значение должно быть в подзапросе и в случае SELECT-а.

5 — такой "цикл" не будет работать в принципе, потому что нет способов задать порядок
вычислений.
Re[2]: Q&A: Set и Select
От: _MarlboroMan_ Россия  
Дата: 17.07.07 03:27
Оценка:
Здравствуйте, MasterZiv, Вы писали:

MZ>Здравствуйте, Дмитрий Полюдов, Вы писали:


MZ>4 и 5 неверно.


MZ>Одно значение должно быть в подзапросе и в случае SELECT-а.


рекомендую проверитью и отписаться о результатах.

MZ>5 — такой "цикл" не будет работать в принципе, потому что нет способов задать порядок

MZ>вычислений.

работать будет. порядок вычислений задается директивой "order by". рекомендую проверитью и отписаться о результатах.

— сколько программистов надо чтобы заменить сгоревшую лампочку?
— сколько не бери, а лампочку не поменять — проблема аппаратная, программным путем не решается...
Re[3]: Q&A: Set и Select
От: MasterZiv СССР  
Дата: 17.07.07 07:57
Оценка:
_MarlboroMan_ пишет:

> работать будет. порядок вычислений задается директивой "order by".


Это — твои мечты. ORDER BY — порядок следования записей в результирующем
наборе, а не порядок вычисления этих записей. Они могут отличаться.
А второй порядок не задается никак, если ты не форсируешь план запроса.
Posted via RSDN NNTP Server 2.1 beta
Re[4]: Q&A: Set и Select
От: Sinclair Россия https://github.com/evilguest/
Дата: 26.07.07 02:21
Оценка:
Здравствуйте, MasterZiv, Вы писали:
MZ>Это — твои мечты. ORDER BY — порядок следования записей в результирующем
MZ>наборе, а не порядок вычисления этих записей. Они могут отличаться.
Неправда. Вот смотри:
select a from table order by id

никакой неопределенности не вызывает, так?
теперь вот так:
select @a+a from table order by id

тоже все однозначно?
Вот и в
select @a=@a+a from table order by id

никаких проблем нет.
Потому, что вычисления выражений с переменными делается именно в результирующем наборе. Так устроен сервер; никаких форсирований плана тут не надо.
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[5]: Q&A: Set и Select
От: MasterZiv СССР  
Дата: 26.07.07 08:04
Оценка:
Sinclair пишет:

> Потому, что вычисления выражений с переменными делается именно в

> результирующем наборе. Так устроен сервер; никаких форсирований плана
> тут не надо.

Включи парралельное выполнение запросов — посмотрим.
Posted via RSDN NNTP Server 2.1 beta
Re[6]: Q&A: Set и Select
От: Sinclair Россия https://github.com/evilguest/
Дата: 26.07.07 08:54
Оценка:
Здравствуйте, MasterZiv, Вы писали:
MZ>Включи парралельное выполнение запросов — посмотрим.
Мне — негде.
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.