是否可以限制查询的记录数量?

Dev*_*ate -2 sql sql-server

就本问题而言,其结果或准确性无关紧要.我只是想知道是否可以查询表的前1000行.这可能只产生100个结果,或者它可能返回1000.我不想明确限制结果,只需要查询的行数.

bil*_*nkc 8

既然你不关心你得到什么结果,我在这些场景中找到tableample.

当满足以下任一条件时,您可以使用TABLESAMPLE快速从大表中返回样本:

  • 样本不必是单个行级别的真正随机样本.
  • 表的各个页面上的行与同一页面上的其他行不相关.
SELECT DISTINCT
    D.SomeValue
FROM
    dbo.MyTable AS D TABLESAMPLE(1000 ROWS);
Run Code Online (Sandbox Code Playgroud)

将要发生的是数据库引擎将占用大约1k行然后过滤它.如何获取这些行无关紧要,因为您不在乎,您只想查看该数据集合中的唯一值.

您可能需要运行几次.对我16M行表的前3次运行没有结果.

有关无结果问题的更多信息,有一个很好的写作 采样使用TABLESAMPLE h/t给马丁史密斯


ype*_*eᵀᴹ 5

如果查询是简单,只有1表FROM子句中,你可以简单地改变SELECT <columns>SELECT TOP 100 <columns>(注意:不是,如果它是一个DISTINCT).


如果查询更复杂,多次引用多个表和/或单个表,则可以更改要限制的表的出现位置,即更改:

SELECT ...
FROM ...                   -- some tables
   <table_name> AS x
   ...                     -- some more joins
WHERE ...
... ;
Run Code Online (Sandbox Code Playgroud)

至:

SELECT ...
FROM ...                   -- some tables
   ( SELECT TOP 100 *
     FROM <table_name>
     ORDER BY <some_columns>     -- without ORDER BY  if you don't care
                                 -- which 100 rows will be checked
   ) AS x
   ...                     -- some more joins
WHERE ...
... ;
Run Code Online (Sandbox Code Playgroud)

另一种方法,它将使用简单的情况(无论是否具有DISTINCT)以及查询是否更复杂,多次引用表并且您希望限制该表的所有出现:

WITH table_name AS
   ( SELECT TOP 100 *
     FROM <table_name>
     ORDER BY <some_columns>     -- without ORDER BY  if you don't care
                                 -- which 100 rows will be checked
   ) 
SELECT ...
--- your query unchanged ;
Run Code Online (Sandbox Code Playgroud)

  • @ScottBeeson别担心,真的不会回答我无论如何也无法发布完整的答案. (3认同)