Есть тиблияка и вней записи. В табличке есть колонка Id — это колонка уникальна но значения не идут в хронологическом порядке. Необходимо по входящему Id выбрать 6 записей до него и 5 записей после него. То есь надо сделать примерно такое.
WITH CTEListGalleryAnimal AS (
SELECT ROW_NUMBER() OVER (ORDER BY Id DESC)AS Row,
Id,
name,
description,
[file],
sfile,
animalId,
breedId
FROM GalleryAnimal where Id between (5000-12) and (5000+12))
SELECT Id,
name,
description,
[file],
sfile,
animalId,
breedId
FROM CTEListGalleryAnimal
WHERE Row BETWEEN 1 AND 12;
Где 5000 это входищий Id.
Посоветуйте решение.
Re: MSSQL - Выбрать записи в определенном диапазоне.
Здравствуйте, MasterMind, Вы писали:
MM>Есть тиблияка и вней записи. В табличке есть колонка Id — это колонка уникальна но значения не идут в хронологическом порядке. Необходимо по входящему Id выбрать 6 записей до него и 5 записей после него. То есь надо сделать примерно такое.
Что-то я из примера не понял, какая колонка задает тот самый хронологический порядок. Вы у себя в примере все равно выбираете +- 12 записей по Id, потом зачем-то их нумеруете и выбираете первые 12.
То что у вас написано, можно короче написать как:
SELECT top 12 Id,name, description,[file],sfile,animalId,breedId
FROM GalleryAnimal
where Id between (5000-12) and (5000+12)
order by id
Единственное, у вас порядок произвольный будет — так как порядок первой выборки не определен и может меняться всякий раз. Если вы хотите, чтобы выборка была в порядке добавления, то нужно поле c датой добавления. Запрос немного другой будет.
Шурыгин Сергей
"Не следует преумножать сущности сверх необходимости" (с) Оккам
Re[2]: MSSQL - Выбрать записи в определенном диапазоне.
Здравствуйте, Sshur, Вы писали:
S>Здравствуйте, MasterMind, Вы писали:
MM>>Есть тиблияка и вней записи. В табличке есть колонка Id — это колонка уникальна но значения не идут в хронологическом порядке. Необходимо по входящему Id выбрать 6 записей до него и 5 записей после него. То есь надо сделать примерно такое.
S>Что-то я из примера не понял, какая колонка задает тот самый хронологический порядок. Вы у себя в примере все равно выбираете +- 12 записей по Id, потом зачем-то их нумеруете и выбираете первые 12.
S>То что у вас написано, можно короче написать как:
S>
S>SELECT top 12 Id,name, description,[file],sfile,animalId,breedId
S>FROM GalleryAnimal
S>where Id between (5000-12) and (5000+12)
S>order by id
S>
S>Единственное, у вас порядок произвольный будет — так как порядок первой выборки не определен и может меняться всякий раз. Если вы хотите, чтобы выборка была в порядке добавления, то нужно поле c датой добавления. Запрос немного другой будет.
Колонка Id и не является хроноологическим порядком — я привёл пример для случае если бы она им была — то можно было бы через битвие или роунум делать.
Re[3]: MSSQL - Выбрать записи в определенном диапазоне.
MM>Колонка Id и не является хроноологическим порядком — я привёл пример для случае если бы она им была — то можно было бы через битвие или роунум делать.
Ну, а в чем тогда заключается вопрос? Из РСУБД невозможно выбрать записи в определенном порядке, если нет колонки, которая этот порядок задает
Шурыгин Сергей
"Не следует преумножать сущности сверх необходимости" (с) Оккам
Re[4]: MSSQL - Выбрать записи в определенном диапазоне.
Здравствуйте, Sshur, Вы писали:
S>Здравствуйте, MasterMind, Вы писали:
MM>>Колонка Id и не является хроноологическим порядком — я привёл пример для случае если бы она им была — то можно было бы через битвие или роунум делать.
S>Ну, а в чем тогда заключается вопрос? Из РСУБД невозможно выбрать записи в определенном порядке, если нет колонки, которая этот порядок задает
Но её можно с генерировать.
SET @index = 0;
SELECT @index + 1, ...;
Re[5]: MSSQL - Выбрать записи в определенном диапазоне.
S>>Ну, а в чем тогда заключается вопрос? Из РСУБД невозможно выбрать записи в определенном порядке, если нет колонки, которая этот порядок задает
G>Но её можно с генерировать. G>SET @index = 0; G>SELECT @index + 1, ...;
Это что ?? Могу предположить, что вы хотите либо идентити, либо rownumber() свой изобрести
Шурыгин Сергей
"Не следует преумножать сущности сверх необходимости" (с) Оккам
Re[6]: MSSQL - Выбрать записи в определенном диапазоне.
G>>Но её можно с генерировать. G>>SET @index = 0; G>>SELECT @index + 1, ...;
S>Это что ?? Могу предположить, что вы хотите либо идентити, либо rownumber() свой изобрести
А это и есть роунамбер для бедных (MySQL)
Re: MSSQL - Выбрать записи в определенном диапазоне.
USE [db_obd_2]
GO
/****** Object: Table [dbo].[zz_Ids] Script Date: 10/16/2009 14:26:46 ******/SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[zz_Ids](
[ID] [int] NOT NULL,
CONSTRAINT [PK_zz_Ids] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
DECLARE @ID AS INT
SET @ID = 288
SELECT i.[ID]
FROM
[dbo].[zz_Ids] AS i
INNER JOIN
(
SELECT TOP 6 i0_.ID
FROM dbo.zz_Ids i0_
WHERE i0_.ID < @ID
ORDER BY i0_.ID DESC
UNION ALL
SELECT TOP 5 i1_.ID
FROM dbo.zz_Ids i1_
WHERE i1_.ID > @ID
ORDER BY i0_.ID ASC
) AS i__
ON i.ID = i__.ID
Так сойдёт?
PS: Мегаоптимизаторам запросов молчать!!! :-)
Наука изощряет ум; ученье вострит память.
(c) Козьма Прутков
Re[7]: MSSQL - Выбрать записи в определенном диапазоне.
G>>>Но её можно с генерировать. G>>>SET @index = 0; G>>>SELECT @index + 1, ...;
S>>Это что ?? Могу предположить, что вы хотите либо идентити, либо rownumber() свой изобрести
A>А это и есть роунамбер для бедных (MySQL)