0

我几乎是数据库查询的新手。但是,我确实理解相关子查询为什么以及如何昂贵且最好避免。给定以下简单示例 - 有人可以帮助替换连接以帮助了解它如何获得更好的分数:

SQL> select
  2    book_key,
  3    store_key,
  4    quantity
  5  from
  6    sales s
  7  where
  8    quantity < (select max(quantity)
  9                 from sales
 10                 where book_key = s.book_key); 

除了加入,我们还有什么其他的选择来避免子查询。

4

3 回答 3

0

使用公用表表达式(CTE) 将允许您执行单个主 SELECT 语句并将结果存储在临时结果集中。然后可以多次自引用和访问数据,而无需再次执行初始的 SELECT 语句,也不需要可能昂贵的 JOIN。此解决方案还使用ROW_NUMBER()OVER子句根据数量按降序对匹配的 BOOK_KEY 进行编号。然后,您将只包含数量小于每个 BOOK_KEY 的最大数量的记录。

with CTE as
(
  select 
    book_key, 
    store_key, 
    quantity,
    row_number() over(partition by book_key order by quantity desc) rn
  from sales
)
select 
  book_key, 
  store_key, 
  quantity 
from CTE where rn > 1;

工作演示:http ://sqlfiddle.com/#!3/f0051/1

于 2013-05-30T19:27:01.643 回答
0

在这种情况下,最好在一次访问表时使用窗口函数 - 如下所示:

with s as
(select book_key, 
        store_key, 
        quantity, 
        max(quantity) over (partition by book_key) mq
 from sales)
select book_key, store_key, quantity
from s 
where quantity < s.mq
于 2013-05-30T16:47:54.220 回答
-1

除了加入,我们还有什么其他的选择来避免子查询。

你使用这样的东西:

SELECT select max(quantity)
INTO @myvar 
from sales
where book_key = s.book_key

select book_key,store_key,quantity
from sales s
where quantity < @myvar
于 2013-05-30T16:51:56.077 回答