使SQL查询更有效

时间:2009-07-31 04:31:54

标签: sql performance tsql

我有一个查询

select b.* from
(select key, max(val) as val from (somequery) group by key) as a
inner join
(somequery) as b
on a.key = b.key and a.val = b.val
order by key

我想知道是否有一种显而易见的方法(我错过了)来简化它(假设某些查询可能相当长)。

任何想法都会受到赞赏。

3 个答案:

答案 0 :(得分:2)

有,但肯定不明显:

select
    *
from
    (
    select
        key,
        val,
        col,
        max(val) over (partition by key) as MaxVal
    from
        tableA
    )
where
    val = MaxVal

使用over子句是一种很好的方法,并且不需要任何无关的子查询。它所做的只是每个键获取最大val,然后将结果集包装在子查询中,我们可以在valMaxVal进行检查,以确保我们将其拉出正确的行。

比最多三个子查询更清洁,更快!

答案 1 :(得分:0)

你想为此使用ROW_NUMBER()或RANK()。

(请确保先前的查询以分号结尾)

with ranked as
(
select *, row_number() over (partition by key order by val desc) as bestrow
from sometableorquery 
)
select *
from ranked
where bestrow = 1
order by key;

如果你想要关系(这样一个有两个最佳值的键同时返回),那么使用rank()而不是row_number()。

罗布

答案 2 :(得分:-1)

我会在选择子查询之前将其选择到临时表中。我认为你会看到显着的性能提升。