2

私は、残念ながらあまりうまく設計されていないテーブルを使用する必要があります。この表には、他の製品と一致した既存の製品がリストされています。一致には、メインカテゴリの製品との一致と代替カテゴリの製品との一致の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が使用された場合の結果に影響を与えることを意味します。

4

2 に答える 2

4
select 
   pm.product_id, 
   cast(
      collect(
         coalesce(
            pm.MAIN_CATEGORY_ID, 
            pm.ALTERNATIVE_CATEGORY_ID || '-' || pr.PRODUCT_SERIAL_NO
         )
      ) as myType
   ) as product_matches
from 
   product_match pm
   left join PRODUCT pr
      on pr.PRODUCT_ID = pm.ALTERNATIVE_CATEGORY_ID
group by 
   pm.product_id
于 2013-02-23T15:45:21.813 に答える
1

LISTAGG()またはWM_CONCAT()関数は、ネストされたテーブルまたはコレクションではなくテーブルがあると書いたときに探しているものだと思います。Collectはコレクションを返し、主に単純な表ではなくPL/SQLデータ型で使用されます。LISTAGG()またはWM_CONCAT()は、例とまったく同じように、値を1つの文字列に連結します。申し訳ありませんが、出力が非常に混乱するため、クエリを追加しません。product_id = 1001に一致するBookのみが表示され、DVDなどは表示されません。SQL Fiddleを使用してサンプルデータを作成するか、単にテーブルを作成して挿入すると便利です。将来的にこれを行ってください。

これは私にとってはうまくいきました-emp_testはscott.empテーブルの正確なコピーです:

ALTERE TABLE emp_test MODIFY ename VARCHAR2(3000);

Update emp_test set ename = rpad(ename, 3000, ' '); Commit;

SELECT deptno
     , LISTAGG(TRIM(SUBSTR(ename, 1, 3000)), ',') WITHIN GROUP (ORDER BY ename) AS employees
    , count(*) total_emps
  FROM emp_test
GROUP BY deptno
/

SELECT deptno
     , WM_CONCAT(TRIM(SUBSTR(ename, 1, 3000))) AS employees
     , count(*) total_emps
 FROM emp_test
GROUP BY deptno
/
于 2013-02-27T15:03:36.550 に答える