Консультация № 187075
03.01.2013, 22:18
102.74 руб.
0 5 1
Здравствуйте! Прошу помощи в следующем вопросе:
Для MSSQL помогите пожалуста написать запрос

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

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

Спасибо!

Обсуждение

Неизвестный
04.01.2013, 17:51
общий
немного не понял смысл что нужно сделать.
вот просто общий запрос

select *
from ((sp inner join j on j.[Номер изделия]=sp.[Номер изделия] ) inner join p on p.[Номер детали]=sp.[Номер детали] ) inner join s on s.[Номер поставщика]=sp.[Номер поставщика]

дальше нужно добавить порядок сортировки, но по каким признакам делать сортировку не указано.
например для сортировки по убыванию фамилии поставщика + по возрастанию номера изделия + по возрастанию номера детали нужно добавить строку

order by s.[Фамилия] DESC, sp.[Номер изделия] , sp.[Номер детали]




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

select sp.[Номер изделия]
from то же самое из предыдущего запроса
where s.[Номер поставщика]= указать_код_поставщика
group by sp.[Номер изделия]


Неизвестный
04.01.2013, 19:12
общий
Общий запрос, я понимаю как записать, а вот как скроллирующим курсором ( Объявление курсора:
DECLARE имя_курсора CURSOR FOR SELECT текст_запроса) не знаю, помогите, если можете! Спасибо!
Неизвестный
04.01.2013, 21:01
общий
почти так.
курсоры используются, в основном, в хранимых процедурах, а также в триггерах и скриптах.

при открытии курсора с параметром SCROLL можно использовать полные возможности управления курсором - перемещение и произвольная выборка с использованием инструкции FETCH с различными параметрами.

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

--объявляем переменную, куда будем заносить результат
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.[Фамилия]=’указать_фамилию_поставщика’
--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


как-то так. проверить не могу - сервер есть только на работе.
Неизвестный
05.01.2013, 17:41
общий
что-то нет ответа. там заканчивается время вопроса. вечером оформлю ответ если что.
Неизвестный
06.01.2013, 19:31
общий
это ответ
Здравствуйте, 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

С уважением.
Форма ответа