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 <= @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 > 0 begin select '''+@columnName+
''' as "Колонка", @resultCount as "Число совпадений" end;';
EXECUTE (@query); -- Выполнение запроса
Set @I = @I + 1 -- Увеличение счётчика
end
|