Часть запроса

Дмитрий
Дата: 13.03.2001 10:40:40
Добрый день!

А не подскажут ли уважаемые отцы, как в SQL Server 7.0 получить в результирующем наборе часть строк? Например, я передаю хранимой процедуре одними из параметров - "вернуть строки с 20 по 30" (причем сначала ищутся все записи, удовлетворяющие другим критериям поиска)? Проблема в следующем - делаю базу с автопереводом слов на разные языки. Выборка двух с половиной тысяч записей занимает 3-4 секунды. Есть таблицы: "клиенты", "анкеты", "фразы", "имена клиентов". Для таблиц "клиенты", "анкеты" и "имена клиентов" уникальный OwnerID (ID клиента). В таблице "фразы" содержатся фразы, на которые ссылаются поля в таблице "анкеты". Структура таблицы "фразы":

PhrazeID - идентификатор
LangID - ID языка
Phraze - собственно фраза.

Так как таблица "анкеты" объемная, то даже при JOIN'е таблицы "фразы" запрос тормозит. Поэтому хотелось бы подставлять значения только в те строки результирующего набора, которые попадают в выбранный промежуток... Извините, если все запутано. Для примера кусок кода, перед которым собственно и надо установить обрабатываемый промежуток:

--далее вставляем фразы на запрошенном языке (цвет глаз, цвет волос, натура, имя клиента, название страны)
UPDATE #Results SET Eyecolor= cl.Phraze FROM #Results JOIN Phrases cl on cl.PhraseID=#Results.EyeID AND cl.LangID=@LangID
UPDATE #Results SET Haircolor= cl.Phraze FROM #Results JOIN Phrases cl on cl.PhraseID=#Results.HairID AND cl.LangID=@LangID
UPDATE #Results SET Nature= cl.Phraze FROM #Results JOIN Phrases cl on cl.PhraseID=#Results.YNat AND cl.LangID=@LangID
UPDATE #Results SET Zodiac= cl.Phraze FROM #Results JOIN Phrases cl on cl.PhraseID=#Results.Zod AND cl.LangID=@LangID

С удовольствием поделюсь с отцами показами RLE за неоценимую помощь...
ArtP
Дата: 13.03.2001 12:29:52
У SQL Server есть только оператор TOP например

select TOP 10 * from table1 order by 1

возвращает первые 10 записей
Но не понятно зачем это в данном случае может быть тебе просто переписать UPDATE

UPDATE #Results SET Eyecolor= cl.Phraze FROM Phrases cl WHERE cl.PhraseID=#Results.EyeID AND cl.LangID=@LangID AND #Results.id>=10 AND #Results.id<=20

Если в #Results нет id, то проведи операцию в два этапа создав промежуточную таблицу с id
Дмитрий
Дата: 13.03.2001 18:10:27
Спасибо всем, уже разобрался... И работает все влет, и процедуте можно передавать параметры, с какой по какую строки обработать полностью, а какие игнорировать... И без SELECT TOP !
alex
Дата: 13.03.2001 19:08:55
А вы реализовали это так как ArtP предлагал?

Александр.
Дмитрий
Дата: 14.03.2001 13:23:32
Вкратце о реализации: поскольку нужда в полностью заполненных полях - грубо говоря, текущая запрошенная страница их n записей (самая критичная по времени процедура в моем случае) лежит в узком диапазоне, делаем следующее: Выбираем все нужные записи, удовлетворяющие условиям отбора, из таблиц (это быстро, поскольку в таблице "Анкеты" только числовые индексы-ссылки на фразы из таблицы "Фразы"). Далее нумеруем все записи таблицы от 1 до "кол-во записей" (для этого завел отдельное поле). А уже потом выбранный промежуток обрабатываем полностью (вставляем фразы на нужном языке и пр). В итоге получился выигрыш в скорости исполнения порядка 4-5 раз визуально... Диапазон обрабатываемых записей передается в процедуру в качестве параметров, что очень удобно - в ASP-скрипте поменяли константу количества записей на странице и все! Остальное не наша проблема...