Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 不影响性能的DB结果数的最大和最小界限_Sql_H2 - Fatal编程技术网

Sql 不影响性能的DB结果数的最大和最小界限

Sql 不影响性能的DB结果数的最大和最小界限,sql,h2,Sql,H2,我想从一个数据库中选择结果数有界的行。我总是希望返回的结果数量最少,即使这意味着忽略我的其他条件,我也不希望返回的结果数量超过最大数量 我当前的查询如下所示: (SELECT * FROM Athletes WHERE Height > 72 FETCH FIRST 10 ROWS ONLY) UNION (SELECT * FROM Athletes ORDER BY Height DESC FETCH FIRST 3 ROWS ONLY) FETCH FIRST

我想从一个数据库中选择结果数有界的行。我总是希望返回的结果数量最少,即使这意味着忽略我的其他条件,我也不希望返回的结果数量超过最大数量

我当前的查询如下所示:

(SELECT * FROM Athletes WHERE Height > 72
    FETCH FIRST 10 ROWS ONLY)
UNION
(SELECT * FROM Athletes
    ORDER BY Height DESC
    FETCH FIRST 3 ROWS ONLY)
FETCH FIRST 10 ROWS ONLY
这里的想法是,我想找到所有身高超过6英尺72的运动员。如果超过十名,我只想要其中的任何十名,但是如果少于三名,我想要三名最高的运动员,即使有些运动员身高在六英尺以下


这在我的测试数据上运行良好,但我想在生产中去掉UNION。如何在没有任何性能消耗位(如UNION或DISTINCT)的情况下重写此文件?

一种方法是使用CTE:

with ten as (
      SELECT *
      FROM Athletes
      WHERE Height > 72
      FETCH FIRST 10 ROWS ONLY
     )
select t.*
from ten
where (select count(*) from ten) >= 3
union all
select a.*
from atheletes
where (select count(*) from ten) < 3
order by height desc
fetch first 3 rows only;
我认为这应该非常快,因为在一个表中计算10行应该非常快,并且没有重复消除

编辑:

另一种方法使用窗口函数,但性能可能较差:

select a.*
from (select a.*,
             sum(case when height > 72 then 1 else 0 end) over () as num_gt72,
             row_number() over (order by height desc) as seqnum
      from (select a.*
            from athletes a
            order by height desc
            fetch first 10 rows only
           ) a
     ) a
where seqnum <= num_gt72 or
      (seqnum <= 3 and num_gt72 < 3);