Отправляет email-рассылки с помощью сервиса Sendsay

RFpro.ru: Базы данных MS SQL

  Все выпуски  

RFpro.ru: Базы данных MS SQL


Хостинг портала RFpro.ru:
Московский хостер
Профессиональный ХОСТИНГ на базе Linux x64 и Windows x64

РАССЫЛКИ ПОРТАЛА RFPRO.RU

Лучшие эксперты по данной тематике

Коцюрбенко Алексей aka Жерар
Статус: Советник
Рейтинг: 4089
∙ повысить рейтинг »
Megaloman
Статус: Академик
Рейтинг: 1787
∙ повысить рейтинг »
Абаянцев Юрий Леонидович aka Ayl
Статус: Профессионал
Рейтинг: 1761
∙ повысить рейтинг »

/ КОМПЬЮТЕРЫ И СОФТ / Базы данных / MSSQL, Oracle, Interbase, Firebird, FoxPro

Номер выпуска:95
Дата выхода:07.01.2013, 23:00
Администратор рассылки:Филатов Евгений Геннадьевич (Профессионал)
Подписчиков / экспертов:52 / 23
Вопросов / ответов:1 / 1

Консультация # 187075: Здравствуйте! Прошу помощи в следующем вопросе: Для MSSQL помогите пожалуста написать запрос Таблица поставщиков (S) (Hомеp поставщика,Фамилия,Рейтинг ,Гоpод ) Таблица деталей (P) (Номер детали,Название,Цвет,Вес,Город) Таблица изделий (J)(Номер изделия,Название,Город) Таблица поставок (SPJ)(Номер поставщика,Номер детали,Номер изд...


Консультация # 187075:

Здравствуйте! Прошу помощи в следующем вопросе:
Для MSSQL помогите пожалуста написать запрос

Таблица поставщиков (S) (Hомеp поставщика,Фамилия,Рейтинг ,Гоpод )
Таблица деталей (P) (Номер детали,Название,Цвет,Вес,Город)
Таблица изделий (J)(Номер изделия,Название,Город)
Таблица поставок (SPJ)(Номер поставщика,Номер детали,Номер изделия, Количество)

Используя скроллирующий курсор, выводить результаты выполнения запроса в обратном порядке:
Получить номера изделий, использующих по крайней мере одну деталь, поставляемую поставщиком S1.

Спасибо!

Дата отправки: 03.01.2013, 22:18
Вопрос задал: pavell (Посетитель)
Всего ответов: 1
Страница онлайн-консультации »


Консультирует Филатов Евгений Геннадьевич (Профессионал):

Здравствуйте, pavell!

Курсоры используются, в основном, в хранимых процедурах, а также в триггерах и скриптах.

Курсор может задаваться в двух режимах – последовательном и скроллирующем.
Последовательный курсор позволяет просматривать только в последовательном порядке с использованием инструкции FETCH NEXT.
При открытии курсора с параметром SCROLL можно использовать полные возможности управления курсором - перемещение и произвольная выборка с использованием инструкции FETCH с различными параметрами:
NEXT – выбирает следующую строку
PREVIOUS ( PRIOR ) – выбирает предыдущую строку
FIRST – выбирает первую строку
LAST – выбирает последнюю строку
CURRENT – выбирает текущую строку ( выбранную ранее )
RELATIVE – выбирает строку, смещенную относительно текущей
ABSOLUTE – выбирает строку с указанным номером ( нумерация с 1 )
Выбранная строка становится текущей.

В случае успешной выборки значений в переменной @@FETCH_STATUS соде ржится значение 0.

Для отбора номеров изделий, использующих по крайней мере одну деталь, поставляемую поставщиком S1, добавляем в процедуру следующий код:


--объявляем переменную, куда будем заносить результат
DECLARE @NomIzd int

--объявляем курсор
DECLARE Izd_cursor SCROLL CURSOR FOR
select sp.[Номер изделия]
from ((sp inner join j on j.[Номер изделия]=sp.[Номер изделия] ) inner join p on p.[Номер детали]=sp.[Номер детали] ) inner join s on s.[Номер поставщика]=sp.[Номер поставщика]
where s.[ Номер поставщика]=указать_номер_поставщика
order by sp.[Номер изделия]
group by sp.[Номер изделия]

--если известен номер поставщика, то можно упростить запрос
--DECLARE Izd_cursor SCROLL CURSOR FOR
--select sp.[Номер изделия]
--from sp
--where sp.[ Номер поставщика]=указать_номер_поставщика
--order by sp.[Номер изделия]
--group by sp.[Номер изделия]

--если известна фамилия поставщика и по ней делается отбор, то нужно добавить еще одну таблицу в запрос
--DECLARE Izd_cursor SCROLL CURSOR FOR
--select sp.[Номер изделия]
--from sp inner join s on s.[Номер поставщика]=sp.[Номер поставщика]
--where s.[Фамилия]=’указать_фамилию_поставщика’ или =’S1’, если это наименование поставщика, или =@S1, если имя поставщика занесено в переменную S1
--order by sp.[Номер изделия]
--group by sp.[Номер изделия]


--открываем курсор
OPEN Izd_cursor
--перемещаемся на последнюю запись и заносим значение номера изделия из курсора в переменную
FETCH LAST FROM Izd_cursor INTO @NomIzd

--до тех, пока нет ошибок ( т.е. не достигнуто начало или конец записей )
WHILE @@FETCH_STATUS = 0
BEGIN
--отображаем текущее значение переменной
PRINT Номер изделия: ' + @ NomIzd
--перемещаемся на 1 строку перед текущей и заносим в переменную, предыдущая строка становится текущей
FETCH RELATIVE -1 FROM Izd_cursor INTO @NomIzd
--идем дальше п о циклу на проверку
END

--закрываем курсор
CLOSE Izd_cursor;
--очищаем память
DEALLOCATE Izd_cursor;
GO

С уважением.

Консультировал: Филатов Евгений Геннадьевич (Профессионал)
Дата отправки: 06.01.2013, 19:31
Рейтинг ответа:

НЕ одобряю 0 одобряю!


Оценить выпуск | Задать вопрос экспертам

главная страница  |  стать участником  |  получить консультацию
техническая поддержка  |  восстановить логин/пароль

Дорогой читатель!
Команда портала RFPRO.RU благодарит Вас за то, что Вы пользуетесь нашими услугами. Вы только что прочли очередной выпуск рассылки. Мы старались. Пожалуйста, оцените его. Если совет помог Вам, если Вам понравился ответ, Вы можете поблагодарить автора - для этого в каждом ответе есть специальные ссылки. Вы можете оставить отзыв о работе портале. Нам очень важно знать Ваше мнение. Вы можете поближе познакомиться с жизнью портала, посетив наш форум, почитав журнал, который издают наши эксперты. Если у Вас есть желание помочь людям, поделиться своими знаниями, Вы можете зарегистрироваться экспертом. Заходите - у нас интересно!
МЫ РАБОТАЕМ ДЛЯ ВАС!



В избранное