![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Запрос для [MSSQL]
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 я еще не сталкивался.