SQL Server 2008 эмулирует функцию LIMIT - PullRequest
1 голос
/ 19 ноября 2011

У меня есть следующий рабочий запрос:

        string sqlString =
            "SELECT  * " +
            "FROM (SELECT ROW_NUMBER() OVER (ORDER BY Id DESC) AS RowNum, * " +
            "FROM StreamView " +
            "WHERE Recipient = @Recipient " +
            ") AS RowConstrainedResult " +
            "WHERE RowNum >= @startAt " +
            "AND RowNum < @howMany " +
            "ORDER BY RowNum;";

, который затем возвращает правильные строки с учетом переменных startAt и howMany.Я хотел бы сделать то же самое с запросом ниже:

        string sqlString =
        "SELECT DISTINCT l.* FROM Streams l " +
        "INNER JOIN Friendships f ON f.Sender = @UserName OR f.Recipient = @UserName " +
        "WHERE l.Sender <> @UserName AND l.Recipient <> @UserName AND ( " +
        "l.Sender = f.Recipient OR l.Sender = f.Sender OR " +
        "l.Recipient = f.Sender OR l.Recipient = f.Recipient) " +
        "ORDER BY DateTime DESC;";

Запрос выше работает отлично, но я хотел бы получить диапазоны вместо всех доступных строк.Мне нужна та же функциональность, что и в первом запросе.

Идеи?спасибо.

1 Ответ

2 голосов
/ 20 ноября 2011

Вы должны иметь возможность поместить свой исходный запрос в подзапрос или CTE, а затем выбрать его с помощью вызова ROW_NUMBER (). Например, что-то вроде (не проверено):

WITH CTE1 AS (
    SELECT DISTINCT
        l.*  -- List out all of the column names...
    FROM
    ...  -- Rest of your query, but you don't need the ORDER BY
),
CTE2 AS (
    SELECT
        CTE1.*,
        ROW_NUMBER() OVER (ORDER BY DateTime DESC) AS RowNum
    FROM
        CTE1
)
SELECT
    CTE2.*
FROM
    CTE2
WHERE
    RowNum BETWEEN @start_num and @end_num

Я не знаю, какой план запроса SQL Server будет использовать для этого, поэтому производительность может быть не очень хорошей.

...