MSSQL - Выбрать записи в определенном диапазоне.
От: MasterMind Россия  
Дата: 13.10.09 11:33
Оценка:
Есть тиблияка и вней записи. В табличке есть колонка 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 - Выбрать записи в определенном диапазоне.
От: Sshur Россия http://shurygin-sergey.livejournal.com
Дата: 13.10.09 11:53
Оценка:
Здравствуйте, 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 - Выбрать записи в определенном диапазоне.
От: MasterMind Россия  
Дата: 13.10.09 12:02
Оценка:
Здравствуйте, 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 - Выбрать записи в определенном диапазоне.
От: Sshur Россия http://shurygin-sergey.livejournal.com
Дата: 13.10.09 12:10
Оценка:
Здравствуйте, MasterMind, Вы писали:


MM>Колонка Id и не является хроноологическим порядком — я привёл пример для случае если бы она им была — то можно было бы через битвие или роунум делать.


Ну, а в чем тогда заключается вопрос? Из РСУБД невозможно выбрать записи в определенном порядке, если нет колонки, которая этот порядок задает
Шурыгин Сергей

"Не следует преумножать сущности сверх необходимости" (с) Оккам
Re[4]: MSSQL - Выбрать записи в определенном диапазоне.
От: G0ga  
Дата: 14.10.09 20:37
Оценка:
Здравствуйте, Sshur, Вы писали:

S>Здравствуйте, MasterMind, Вы писали:



MM>>Колонка Id и не является хроноологическим порядком — я привёл пример для случае если бы она им была — то можно было бы через битвие или роунум делать.


S>Ну, а в чем тогда заключается вопрос? Из РСУБД невозможно выбрать записи в определенном порядке, если нет колонки, которая этот порядок задает


Но её можно с генерировать.
SET @index = 0;
SELECT @index + 1, ...;
Re[5]: MSSQL - Выбрать записи в определенном диапазоне.
От: Sshur Россия http://shurygin-sergey.livejournal.com
Дата: 15.10.09 06:05
Оценка:
Здравствуйте, G0ga, Вы писали:


S>>Ну, а в чем тогда заключается вопрос? Из РСУБД невозможно выбрать записи в определенном порядке, если нет колонки, которая этот порядок задает


G>Но её можно с генерировать.

G>SET @index = 0;
G>SELECT @index + 1, ...;

Это что ?? Могу предположить, что вы хотите либо идентити, либо rownumber() свой изобрести
Шурыгин Сергей

"Не следует преумножать сущности сверх необходимости" (с) Оккам
Re[6]: MSSQL - Выбрать записи в определенном диапазоне.
От: avpavlov  
Дата: 15.10.09 19:20
Оценка:
G>>Но её можно с генерировать.
G>>SET @index = 0;
G>>SELECT @index + 1, ...;

S>Это что ?? Могу предположить, что вы хотите либо идентити, либо rownumber() свой изобрести


А это и есть роунамбер для бедных (MySQL)
Re: MSSQL - Выбрать записи в определенном диапазоне.
От: ZAMUNDA Земля для жалоб и предложений
Дата: 16.10.09 10:28
Оценка:
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 - Выбрать записи в определенном диапазоне.
От: G0ga  
Дата: 18.10.09 21:35
Оценка: :)
Здравствуйте, avpavlov, Вы писали:


G>>>Но её можно с генерировать.

G>>>SET @index = 0;
G>>>SELECT @index + 1, ...;

S>>Это что ?? Могу предположить, что вы хотите либо идентити, либо rownumber() свой изобрести


A>А это и есть роунамбер для бедных (MySQL)


У БОГАТЫХ свои причиндалы.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.