Добро пожаловать! Это — архивная версия форумов на «Хакер.Ru». Она работает в режиме read-only.
 

Как послеовательно выбрать одно за другим значения из строквого поля таблицы (Microsoft SQL)

Пользователи, просматривающие топик: none

Зашли как: Guest
Все форумы >> [Прочее] >> Как послеовательно выбрать одно за другим значения из строквого поля таблицы (Microsoft SQL)
Имя
Сообщение << Старые топики   Новые топики >>
Как послеовательно выбрать одно за другим значения из строквого поля таблицы (Microsoft SQL) - 2012-03-09 14:30:24.250000   
bob3r

Сообщений: 67
Оценки: 0
Присоединился: 2011-06-03 02:30:17.840000
В таблице есть строковое поле, в нём уникальные значения. Надо на чистом Transact SQL перебрать все значения - выбрать все строки, одну за одной.

В том решении, что я придумал, использую Row_number(), и последовательно выбираю строки с нужным номером строки из таблицы, номер строки - переменная, которая увеличивается в цикле от 1 до COUNT(*) - до общего количества строк в выборке.

Можно ли оптимизировать выборку? Чисто хакерский вопрос, так как быстродействие не особо критично, просто хочется узнать.

На недавний вопрос (не мой) по MySQL был дан отличный ответ. Рассчитываю на помощь.

-=[Техническое задание]=-
В базе данных Microsoft SQL (в данном случае 2005 Express) в таблице Analytics есть множество колонок, все текстовые колонки это тип varchar разной длины, надо используя SQL-запрос сказать в каких колонках присутствует значение, удовлетворяющее конкретному условию.
В данном случае условие: like '%Query Text%'.

Что думаете по первому запросу в цикле? Может вообще можно сделать всё без циклов, а например, используя join?
-=[Используемая реализация]=-
declare @maxI as int declare @I as int declare @columnName as varchar(8000) declare @query as varchar(8000) -- Определение количества элементов в выборке - конечное значение счётчика цикла set @maxI = (SELECT count(*) FROM INFORMATION_SCHEMA.COLUMNS where Table_Name='Analytics' and DATA_TYPE='varchar') --Начальное значение счётчика цикла set @i = 1 while (@I &lt;= @maxI) begin -- Выборка @I-ой строки (последней по счёту строки, среди первых @I строк) -- TOP(1) из TOP(@I) отсортированных по убываю не работал, поэтому и сделано с ROW_NUMBER() --=[ Вопрос: можно ли это как-то оптимизировать? Сделать по другому? ]=-- Set @columnName = (SELECT T.COLUMN_NAME FROM ( SELECT TOP (@I) COLUMN_NAME, ROW_NUMBER() OVER(ORDER BY COLUMN_NAME) AS 'RN' FROM INFORMATION_SCHEMA.COLUMNS where Table_Name='Analytics' and DATA_TYPE='varchar' ) T WHERE T.RN BETWEEN @I AND @I); -- Формирование запроса, в котором делается запрос по колонке с именем @columnName -- Для удобства можно результаты складировать во временную таблицу, но пока это н важно Set @query = 'declare @resultCount as int; set @resultCount = (select count (*) from Analytics where ' + @columnName + ' like ''%Query Text%''); if @resultCount &gt; 0 begin select '''+@columnName+ ''' as "Колонка", @resultCount as "Число совпадений" end;'; EXECUTE (@query); -- Выполнение запроса Set @I = @I + 1 -- Увеличение счётчика end
Post #: 1
Страниц:  [1]
Все форумы >> [Прочее] >> Как послеовательно выбрать одно за другим значения из строквого поля таблицы (Microsoft SQL)







Связаться:
Вопросы по сайту / xakep@glc.ru

Предупреждение: использование полученных знаний в противозаконных целях преследуется по закону.