【问题标题】:When is the proper time to use the SQL statement "SELECT [results] FROM [tables] WHERE [conditions] FETCH FIRST [n] ROWS ONLY"何时是使用 SQL 语句“SELECT [results] FROM [tables] WHERE [conditions] FETCH FIRST [n] ROWS ONLY”的合适时间
【发布时间】:2008-12-30 15:34:49
【问题描述】:

我不太确定只选择一定数量的行会比简单地制作更具体的选择语句更好。我有一种感觉,我错过了一些非常直接的东西,但我无法弄清楚。我在任何 SQL 方面的经验都不到 6 个月,而且很粗略,所以如果这是一个非常简单的问题,但我找不到明确的答案,我很抱歉。

【问题讨论】:

    标签: sql select


    【解决方案1】:

    我知道两种常见的用法:

    分页:一定要指定排序。如果未指定排序,许多数据库实现会使用任何便于执行查询的方式。这种“最佳”排序行为可能会产生非常不可预测的结果。

    SELECT top 10 CustomerName
    FROM Customer
    WHERE CustomerID > 200 --start of page
    ORDER BY CustomerID
    

    子查询:可以发出子查询的许多地方都要求结果是单个值。在许多情况下,top 1 只比 max 快。

    --give me some customer that ordered today
    SELECT CustomerName
    FROM Customer
    WHERE CustomerID =
    (
      SELECT top 1 CustomerID
      FROM Orders
      WHERE OrderDate = @Today
    )
    

    【讨论】:

      【解决方案2】:

      通常是自定义分页。

      【讨论】:

        【解决方案3】:

        我们使用该语句的原因如下:

        1. 只显示最相关的结果(比如前 100 个),而无需将所有行从数据库传输到客户端。在这种情况下,我们也使用 ORDER BY。

        2. 我们只是想知道是否有匹配的行并举几个例子。在这种情况下,我们不对结果进行排序,再次,FETCH FIRST 比让数据库准备传输大量行然后将它们扔给客户端要便宜得多。这通常是在软件开发过程中,需要感受一下某个 SQL 是否正确。

        【讨论】:

          【解决方案4】:

          当您想向用户显示值时,您可能只需要 N 行。一般来说,数据库服务器可以获取前 N 行,比它获取所有行的速度要快,所以你的屏幕重绘可以快一点。

          Oracle 甚至有一个名为 FIRST_ROWS 的提示,它表明快速恢复数据比高效恢复数据更重要。

          【讨论】:

            【解决方案5】:

            SQL 的设计者同意你的观点,这就是为什么标准 SQL 不包括 top/limit/fetch first 等的原因。

            【讨论】:

              【解决方案6】:

              想想谷歌搜索结果和结果通常有多少页。

              虽然很明显,他们的情况还有很多,但这就是想法。

              【讨论】:

                【解决方案7】:

                除了分页之外,任何时候您想从表中获取最多或最少的 [在此处插入度量] 行,按 [任何度量] 排序并限制为 1 行,IME 都比使用 MIN/MAX 执行子查询更好。可能因引擎而异。

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2021-12-29
                  • 2022-08-17
                  • 1970-01-01
                  • 1970-01-01
                  • 2014-10-26
                  相关资源
                  最近更新 更多