【问题标题】:SQL Server 2008 Emulating the LIMIT FunctionSQL Server 2008 模拟 LIMIT 函数
【发布时间】:2012-01-02 00:58:56
【问题描述】:

我有以下工作查询:

        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;";

上面的查询完美运行,但我想获取范围而不是所有可用的行。我需要与第一个查询相同的功能。

想法?谢谢。

【问题讨论】:

  • 排名范围是多少?
  • 什么意思?第一个查询在 c# 类中,并像这样调用 (getstream(0,10,'someone')) - 这会从表中返回第 0 到第 10 行。我正在尝试对第二个查询执行相同的操作,使其结果保持原样,但添加范围功能(用于延迟滚动)
  • 您是按日期订购的——所以您要说订购日期的前 10 个,然后是订购的第 2 个 10 个日期?
  • 是的,我在这里按日期订购只是为了先获得最新的。但你知道的。

标签: sql sql-server sql-server-2008 pagination


【解决方案1】:

您应该能够将原始查询放在子查询或 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 会为此使用什么样的查询计划,因此性能可能不是很好。

【讨论】:

  • 为什么不在 cte1 中? select distinct l.*, ROW_NUMBER() OVER (ORDER BY DateTime DESC) AS RowNum ...
  • 我写查询时脑子里有一个原因,但如果我现在能想到它,我会被诅咒的:)
  • 可能是因为“distinct”关键词。 ;)
猜你喜欢
  • 1970-01-01
  • 2013-04-20
  • 2010-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多