私は、残念ながらあまりうまく設計されていないテーブルを使用する必要があります。この表には、他の製品と一致した既存の製品がリストされています。一致には、メインカテゴリの製品との一致と代替カテゴリの製品との一致の2種類があります。
一致するものがある場合は常に、その一致のIDが、以下のPRODUCT_MATCHに示すように、テーブルの関連する列に入力されます。したがって、各商品行には、PRODUCT_MAIN_CATEGORY_IDまたはPRODUCT_ALTERNATIVE_CATEGORY_IDで指定されたPRODUCT_IDがありますが、両方は指定されていません。
製品
PRODUCT_ID PRODUCT_CATEGORY PRODUCT_SERIAL_NO
1001 Book XSDAD132
1002 MP3 X348023948
1003 DVD 5234234023948
2003 CD SDRX83489
2002 Video 23423879JJ0
PRODUCT_MATCH
PRODUCT_MATCH_ID, PRODUCT_ID, MAIN_CATEGORY_ID, ALTERNATIVE_CATEGORY_ID, PRODUCT_CATEGORY
1 1001 1002 Book
2 1001 1003 Book
3 1002 1004 Book
4 2002 1002 Video
5 2002 1003 Video
6 2002 1001 Video
7 2002 1002 Video
8 1003 2003 DVD
PRODUCT_MATCHテーブルを読み取って、MAIN_CATEGORY_IDに一致する場合は、IDを表示するか、ALTERNATIVE_CATEGORY_IDがある場合は、product_idと製品IDのシリアル番号を表示する必要があります。
結果を表示するために次のクエリを作成しました
select product_id,
cast(collect(coalesce(MAIN_CATEGORY_ID,
decode(ALTERNATIVE_CATEGORY_ID,null,null, ALTERNATIVE_CATEGORY_ID || '-' || PRODUCT_CATEGORY))) as myType) as product_matches
from product_match
group by product_id
注:MyTypeはvarchar(2000)のテーブルとして定義されています
クエリは、nullでない場合はMAIN_CATEGORY_IDを使用し、そうでない場合は、ALTERNATIVE_CATEGORY_IDの値を使用して出力を作成します。合体関数がALTENATIVE_CATEGORY_ID値を使用するたびに、PRODUCT番号のproduct_serial_noと連結されたproduct_idが表示されるようにこれを変更したいと思います。これには、PRODUCTテーブルとの結合が必要になります。
基本的に、私が達成したい出力は次のようになります。
PRODUCT_ID PRODUCT_MATCHES
-----------------------------------
1001 1002,DVD-5234234023948
1002 1004
2002 MP3-X348023948, 1003, 1001, 1002
1003 CD-SDRX83489
テーブルを簡単に結合できることは知っていますが、それほど単純ではありません。問題は、ALTERNATIVE_CATEGORY_IDが使用されている場合にのみ結合を使用したいということです。これは、単純な結合がMAIN_CATEGORY_IDが使用された場合の結果に影響を与えることを意味します。