0

给定以下两个表:

产品类别

PRODUCT_CATEGORY    PRIOTITY

BOOK               100
VIDEO              200
CD                 300

PRODUCT_TYPES

PRODUCT_TYPE_ID PRODUCTID   PRODUCT_CATEGORY
1               1001        VIDEO
2               1001        CD
3               1002        BOOK
4               1002        VIDEO
5               1003        BOOK

我怎样才能加入这两个表,以便我从 PRODUCT_TYPES 中选择所有行,并且在有重复产品的地方,我只选择具有最高优先级的一个。

例如,对于 PRODUCTID 1002,我只想要类别为 VIDEO 的行,因为 VIDEO 的优先级高于 BOOK(这是表中其他 1002 产品的类别)。

这是我尝试过的,但我似乎只得到重复。

select product_type_id, productid, product_category
from product_types pt
join product_categories pc on (pc.product_category=pt.product_category)

另一种方法是按 product_category 降序排序并选择 rownum=1 的第一行,但我怀疑这不是最佳解决方案。

4

3 回答 3

3

尝试以下查询:

 SELECT PT.*
 FROM PRODUCT_CATEGORIES PC INNER JOIN PRODUCT_TYPES PT
 ON PC.PRODUCT_CATEGORY = PT.PRODUCT_CATEGORY
 WHERE PC.PRIOTITY = (
 SELECT MAX(PRIOTITY) FROM PRODUCT_CATEGORIES IPC
   , PRODUCT_TYPES IPT
   WHERE IPC.PRODUCT_CATEGORY = IPT.PRODUCT_CATEGORY
     AND IPT.PRODUCTID = PT.PRODUCTID)
于 2013-02-23T13:57:40.607 回答
3
WITH recordList 
AS
(
    SELECT  a.Product_TypeID,
            a.ProductID,
            a.Product_Category,
            b.Priority,
            ROW_NUMBER() OVER (PARTITION BY a.ProductID
                                ORDER BY b.Priority) RN
    FROM    Product_Types a
            INNER JOIN Product_Categories b
                ON a.Product_Category = b.Product_Category
)
SELECT      Product_TypeID,
            ProductID,
            Product_Category,
            Priority
FROM    recordList
WHERE   RN = 1
于 2013-02-23T13:12:26.640 回答
2
select
   product_type_id,
   productid,
   product_category
from
   PRODUCT_TYPES
where
   product_type_id in (
      select
         max(product_type_id) keep (dense_rank first order by priotity desc)
      from 
         PRODUCT_TYPES
         join PRODUCT_CATEGORIES using(product_category)
      group by 
         productid
   )

SqlFiddle

于 2013-02-23T14:30:38.243 回答