0

次の2つのテーブルがあるとします。

製品カテゴリ

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

2つのテーブルを結合して、PRODUCT_TYPESからすべての行を選択し、重複する製品がある場合は、優先度が最も高いものだけを選択するにはどうすればよいですか。

たとえば、PRODUCTID 1002の場合、VIDEOはBOOK(テーブル内の他の1002製品のカテゴリ)よりも優先度が高いため、VIDEOのカテゴリの行のみが必要です。

これが私が試したことですが、重複しているようです。

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

これを行うもう1つの方法は、product_categoryで降順で並べ替え、rownum = 1である最初の行を選択することですが、これは最善の解決策ではないと思います。

4

3 に答える 3

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 に答える
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 に答える
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 に答える