我不太确定只选择一定数量的行会比简单地制作更具体的选择语句更好。我有一种感觉,我错过了一些非常直接的东西,但我无法弄清楚。我在任何 SQL 方面的经验都不到 6 个月,而且很粗略,所以如果这是一个非常简单的问题,但我找不到明确的答案,我很抱歉。
sql - 何时是使用 SQL 语句“SELECT [results] FROM [tables] WHERE [conditions] FETCH FIRST [n] ROWS ONLY”的合适时间
7 回答
我知道两种常见用途:
分页:一定要指定一个排序。如果未指定排序,许多数据库实现会使用任何便于执行查询的方式。这种“最佳”排序行为可能会产生非常不可预测的结果。
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
)
通常是自定义分页。
我们使用该语句的原因如下:
仅显示最相关的结果(例如前 100 个),而无需将所有行从数据库传输到客户端。在这种情况下,我们也使用 ORDER BY。
我们只想知道是否有匹配的行并举几个例子。在这种情况下,我们不对结果进行排序,再次,FETCH FIRST 比让数据库准备传输大量行然后将它们扔给客户端要便宜得多。这通常是在软件开发过程中,需要感受一下某个 SQL 是否正确。
当您想向用户显示这些值时,您可能只需要 N 行。通常,数据库服务器可以获取前 N 行,比它获取所有行的速度要快,因此您的屏幕重绘可以快一点。
Oracle 甚至有一个名为 FIRST_ROWS 的提示,它表明快速恢复数据比有效恢复数据更重要。
SQL 的设计者同意你的观点,这就是为什么标准 SQL 不包括 top/limit/fetch first 等的原因。
想想谷歌搜索结果和通常用于结果的页面数。
虽然很明显,他们的情况还有很多,但这就是想法。
除了分页之外,任何时候您想要从表中获取最多或最少的 [在此处插入度量] 行,按 [任何度量] 排序并限制为 1 行,IME 都比使用 MIN/MAX 进行子查询更好。可能因发动机而异。