如何在包含最昂贵产品的类别中查找产品

How to find products within the cateogry containing the most expensive product

我目前正在使用以下代码:

SELECT PROD_NO,
       PROD_NAME,
       PROD_TYPE
FROM PRODUCTS
WHERE PROD_SELL IN (SELECT MAX(PROD_SELL)
                    FROM PRODUCTS)

当前输出:

PROD_NO PROD_NAME                      PROD_TYPE           
---------- ------------------------------ --------------------
     40103 StarDome                       Tents  

期望的输出:

 PROD_NO PROD_NAME                      PROD_TYPE           
---------- ------------------------------ --------------------
     40100 Star Lite                      Tents               
     40101 Star Gazer-2                   Tents               
     40102 Star Gazer-3                   Tents               
     40103 StarDome                       Tents 

这是因为 'StarDome' 产品具有最高的 prod_sell

我的代码returns 价格最高的产品类型。但是,该类型中有 4 种产品,我需要列出该类型中的所有产品(返回最高售价)。

我这辈子都想不通。

正如您评论的那样,查询另一个子查询的子查询...听起来效率很低,再次查询相同的 table(我猜是 3 次)。

示例数据:

SQL> select * From products;

   PROD_NO PROD_NAME    PROD_  PROD_SELL
---------- ------------ ----- ----------
     40100 Star Lite    Tents        200
     40101 Star Gazer-2 Tents        100
     40102 Star Gazer-3 Tents        150
     40103 StarDome     Tents        500  --> the most expensive, so - you want all "Tents" as a result
     10000 Whatever     Beds         400
     10001 Something    Bikes        450

6 rows selected.

SQL>

这是您当前的查询(如果我猜对了;table 产品被引用了 3 次):

SQL> select prod_no, prod_name, prod_type
  2  from products                                                 --> first
  3  where prod_type in (select prod_type
  4                      from products                             --> second
  5                      where prod_sell = (select max(prod_sell)
  6                                         from products          --> third
  7                                        )
  8                     )
  9  order by prod_no;

   PROD_NO PROD_NAME    PROD_
---------- ------------ -----
     40100 Star Lite    Tents
     40101 Star Gazer-2 Tents
     40102 Star Gazer-3 Tents
     40103 StarDome     Tents

SQL>

我建议您考虑另一种方法:使用分析函数按价格对产品进行排名,然后获取排名最高[=29]的产品=].

SQL> select prod_type,
  2    max(prod_sell) max_prod_sell,
  3    rank() over (order by max(prod_sell) desc) rnk
  4  from products
  5  group by prod_type;

PROD_ MAX_PROD_SELL        RNK
----- ------------- ----------
Tents           500          1     --> Tents rank as "highest"
Bikes           450          2
Beds            400          3

SQL>

现在,将该查询用作子查询(或 CTE,就像我所做的那样):

SQL> with temp as
  2    (select prod_type,
  3            rank() over (order by max(prod_sell) desc) rnk
  4     from products                                             --> first
  5     group by prod_type
  6    )
  7  select p.prod_no, p.prod_name, p.prod_type
  8  from products p join temp t on t.prod_type = p.prod_type     --> second
  9  where t.rnk = 1
 10  order by p.prod_no;

   PROD_NO PROD_NAME    PROD_
---------- ------------ -----
     40100 Star Lite    Tents
     40101 Star Gazer-2 Tents
     40102 Star Gazer-3 Tents
     40103 StarDome     Tents

SQL>

这与您得到的结果相同,但效率应该更高一些。当然,您不会注意到小 tables 有任何差异,但可能会随着行数越来越高。