Добрый день. Посоветуйте вариант который лучше. TSQL paginat
От: iudjen Молдова  
Дата: 02.03.11 10:04
Оценка:
Есть две таблицы: Ad(объявления) и AdFieldValue(дынные объявления)

Ad table:
Id                    int    
UserId            int
AdCategoryId    int    
Title                    nvarchar(255)    
Description            ntext    
CreatedAt            datetime    
UpdatedAt            datetime    
StartedAt            datetime    
ExpiresAt            datetime    
ViewsCount            int    
Status            tinyint    
Visible             bit    
Vip                    bit


AdFieldValue table:
AdCategoryId    int    
AdFieldId            int    
AdId                    int    
Bool                    bit    
String             nvarchar(255)    
Integer            int    
Float                    float    
StartedAt           datetime


Задача такая:
Писк значений в таблице AdFieldValue (для нахождения AdId).
В текущем примере поиск по данным полям:
            AdCategoryId = 15 AND 
            AdFieldId = 28 AND Integer = 72

Сортировка объявлении по дате (для это есть два варианта 1) поле StartedAt в таблице Ad или 2) дублировать StartedAt в AdFieldValue для того чтобы не делать JOIN
Прошу подсказки как сделать лучший pagination в такой ситуации с сортировкой по StartedAt

Вариант 1:
DECLARE @Skip INT = 50;
DECLARE @Take INT = 25;

SELECT TOP(@Take)
    B.AdId
FROM
(
    SELECT TOP(@Skip + @Take)
        A.AdId,
        ROW_NUMBER() OVER (ORDER BY A.Start DESC) as [RowNumber]
    FROM
    (
        SELECT
            AFV.AdId,
            COUNT(AFV.AdId) AS [Count],
            MAX(AFV.DateStarted) as Start
        FROM
            AdFieldValue AFV
        WHERE
            AdCategoryId = 15 AND 
            AdFieldId = 28 AND Integer = 72
        GROUP BY
            AdId
    )A
    WHERE A.[Count] = 1
)B
WHERE
    B.RowNumber > @Skip



Вариант 2:
DECLARE @Skip INT = 50;
DECLARE @Take INT = 25;

SELECT TOP(@Take)
    B.AdId
FROM
(
    SELECT TOP(@Skip + @Take)
        A.AdId,
        ROW_NUMBER() OVER (ORDER BY Ad.StartedAt DESC) as [RowNumber]
    FROM
    (
        SELECT
            AFV.AdId,
            COUNT(AFV.AdId) AS [Count]
        FROM
            AdFieldValue AFV
        WHERE
            AdCategoryId = 15 AND 
            AdFieldId = 28 AND Integer = 72            
        GROUP BY
            AdId        
    )A
        JOIN Ad ON A.AdId = Ad.Id
    WHERE
        A.[Count] = 1
)B
WHERE
    B.RowNumber > @Skip




Вариант 3:
Если у вас есть свои предложения буду очень благодарен.


Спасибо, c Уважением Евгений.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.