Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Запрос для [MSSQL]


Страницы:   1 2

KAA ©   (2002-03-19 16:10:00) 

Есть таблица "Склад": идентификатор (ключевое поле, автоматически увеличивается для каждой новой записи), наименование детали, цвет детали. В таблицу неограниченное число раз добавляют записи, указывая тип делтали и ее цвет.

Задача: У нас где-то задано кол-во деталей (N). Надо выбрать из таблицы последние поступившие на склад N деталей заданного наименования и заданного цвета.


sniknik   (2002-03-19 19:17:00) [1]

Да с UNION вообще както криво работает. Если поставить TOP в селекты то берется одно большее значение :(.
Но есть еще вариант последовательно скидывать селекты во временную таблицу. ? не пойдет ?


sniknik   (2002-03-19 19:09:00) [2]

Упс.. UNION позволяет только последнюю сортировку так что так не получится


sniknik   (2002-03-19 19:02:00) [3]

тогда запрос должен быть составной и вызыватся через OPENQUERY
тогда можно и TOP использовать значение ему не переменной а строкой давать.


KAA   (2002-03-19 18:50:00) [4]

>sniknik
Кроме того, N для каждого цвета должен быть свой.


KAA   (2002-03-19 18:48:00) [5]

>sniknik
количество цветов может быть любым, отсюда неизвестно, скалько селектов мне придется собирать юниуном.


sniknik   (2002-03-19 18:45:00) [6]

Тогда так попробуй

declare @N int
SET @N = 7
SET ROWCOUNT @N
select * from CASHPAY where ...условие ... order by [ID] DESC
go
для максимума
ASC
для минимума

а для отбора разных по условию
UNION
можно даже одновременно максимум и минимум

select * from CASHPAY where ...условие ... order by [ID] DESC
UNION
select * from CASHPAY where ...условие ... order by [ID] ASC


KAA   (2002-03-19 18:36:00) [7]

Вообщем SET ROWCOUNT @N решение, но есть еще одна задача.

Вторая задача. В результате работы одного селекта можно получить список цветов для определенной детали (кол-во их может быть любым) и для каждого цвета число N. Надо выбрать из таблицы по N деталей каждого заданного цвета, точно так же как и в первой задаче, выбирать надо N последних записей.
Т.е. если в таблице 60 зеленых гаек и 50 красных, а надо выбрать 20 последних пришеднших зеленых и 10 последних красных, в итоговой таблице должны быть 30 гаек (20 и 10).


sniknik   (2002-03-19 18:29:00) [8]

Сорри пропустил.


KAA   (2002-03-19 18:27:00) [9]

Если нужно, в базу будет добавлено поле с датой занесения записи.


KAA   (2002-03-19 18:25:00) [10]

>sniknik
У меня есть поле с автоинкриментом
> идентификатор (ключевое поле, автоматически увеличивается для каждой новой записи)


KAA   (2002-03-19 18:22:00) [11]

>sniknik
Так я в самом начале написал, что есть поле, в котором и хранится это увеличивающееся число. Вообще можно добавить поле с датой добавления записи, вернее в моей таблице оно уже есть, но как показала практика, когда я вручную добавлял записи, это поле я проигнорировал, в автоувеличивающееся поле автоматически получило свое значение.

>Johnmen
Ну я установил такое правило. Если запись пришла позже, значит она обязательно получит номер больше чем у предыдущей записи и соответственно больше чем у все остальных. Нужно рассматривать только N последних.

>alehan
Что такое TADOQuery ?


sniknik   (2002-03-19 18:21:00) [12]

Люди это классическая задача по SQL называется - Нахождение "первого" входа. Решения не имеет так как у базы нет упорядоченной структуры. Записи хранятся там где удобнее самой SQL и первая запись может быть в середине а последняя в начале. Если не писать какое либо значение в поле (DataTime например или автоинкрементное поле) то ничего не выйдет и никакие свойства не помогут.


alehan   (2002-03-19 18:13:00) [13]

Если используется TADOQuery может попробовать свойство MaxRecords?


Johnmen   (2002-03-19 18:13:00) [14]

>KAA © : Какому же условию ?


sniknik   (2002-03-19 18:04:00) [15]

Реляционные базы не понимают что такое первый или последний если не записать эту информацию в поле то задача не имеет решения.


KAA   (2002-03-19 17:57:00) [16]

>Johnmen
По условию задачи, если запись была занесена позже, значит она считается более свежей. Нужно рассматривать N последних записей, удовлетворяющих условию.


Johnmen   (2002-03-19 17:48:00) [17]

>KAA © : Как по номеру можно определить степеньновизны записи ? Не относительную (типа: N больше, значит свежее),
а абсолютную - запись N свежая, потому, что ...........
Так вот - почему же ???? :o))))))))))


sniknik   (2002-03-19 17:47:00) [18]

рабочая замена SELECT TOP @N ?

declare @N int
SET @N = 3
SET ROWCOUNT @N
select * from sc19
go


KAA   (2002-03-19 17:36:00) [19]

>Johnmen
Номер следующей записи будет больше предыдущей.

>Lusha
Один нюанс, это все пишется в хранимой процедуре на SQL сервере, т.е. исключительно средствами MSSQL.

>Donal_Graeme
Это хранимая процедура, не особо важно, либо принимать значение из параметра, либо из базы вытаскивать.


KAA   (2002-03-19 17:22:00) [20]

>Lusha
Имеется ввиду SELECT TOP @N ? Не проглатывает.

>DiggerAbstract
Это для какой SQL? Честно говоря я даже не знаю, как звучит аналог ROW_NUMBER() для MSSQL2000, да и с конструкцией OVER я еще не сталкивался.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо