0

私は2つのテーブルを持っています:

表: 店舗

----------------------------------------------
store_cd    store_nm    active    material_cat_ids
---------------------------------------------
L           Store(L)    Y         20,5
B           Store(B)    Y         7

そしてテーブル:Material_category

----------------------------------------------------------
material_cat_id    name                        active
----------------------------------------------------------
20                 Material Category type A    Y
5                  Material Category type B    Y
7                  Material Category type C    Y

storesここで、両方のテーブル (と)を結合する必要がありmaterial_categoryます。コレクションとして、数値フィールドとしてテーブルを持つstoresと、「in」キーワードを使用できません。material_cat_idsmaterial_categorymaterial_cat_id

これらのテーブルを結合する最良の方法を提案してください。

4

3 に答える 3

3

Material Category ID を文字列として保存するのは、ひどい考えです。手遅れでない場合は、製図板に戻りましょう。リレーショナル データベースの目的を無効にしています。より良いテーブル構造は、次のような新しいテーブルになります。

ストア素材カテゴリ

Store_CD (FK Stores), 
Material_Cat_ID (FK Material_Category), 
Primary Key --> (Store_CD, Material_Cat_ID)

次に、ストアから Material_Cat_ID を取り除きます。必要な 2 つの出力を取得する方法を示すために、いくつかのデモンストレーション クエリと共にスキーマの例をここに示します。

ただし、このテーブル構造を主張する場合は、次のように結合できます。

SELECT  Store_nm, Name
FROM    Stores
        INNER JOIN material_Category
            ON ',' || material_Cat_ids || ',' LIKE '%,' || CAST(material_Cat_ID AS VARCHAR(5)) || ',%';

SQL フィドルの例

編集

リストにカテゴリが必要な場合は、次を使用できます。

SELECT  Store_nm, 
        LISTAGG(Name, ',') WITHIN GROUP (ORDER BY Name) AS Categories
FROM    Stores
        INNER JOIN material_Category
            ON ',' || material_Cat_ids || ',' LIKE '%,' || CAST(material_Cat_ID AS VARCHAR(5)) || ',%'
GROUP BY Store_nm;

于 2012-07-05T09:03:05.060 に答える
2
create table store (store_cd  varchar2(20),store_nm varchar2(20),active  varchar2(1),material_cat_ids varchar2(200));

Insert into STORE
   (STORE_CD, STORE_NM, ACTIVE, MATERIAL_CAT_IDS)
 Values
   ('L', 'Store(L)', 'Y','20,5');
Insert into STORE
  (STORE_CD, STORE_NM, ACTIVE, MATERIAL_CAT_IDS)
 Values
  ('B', 'Store(B)', 'Y', '7');


create table Material_category(material_cat_id number ,name varchar2(20),active varchar2(1));

insert into material_category values(20,' A','Y');
insert into material_category values( 5,' B','Y' );
insert into material_category values(7,'C','Y');

WITH tab as (
SELECT  DISTINCT store_cd
       ,store_NM
       ,active
       ,REGEXP_SUBSTR (material_cat_ids, '[^,]+', 1,LEVEL) material_cat_id
FROM store s
CONNECT BY REGEXP_SUBSTR (material_cat_ids, '[^,]+', 1, LEVEL) IS NOT NULL
  ) 
SELECT * from tab t 
             ,material_category mc 
where t.material_cat_id=to_char(mc.material_cat_id);

出力

SQLFIDDLE の解決

于 2012-07-05T09:32:10.367 に答える
0

Maybe something like this?

select *
from stores
inner join material_category
on ',' + stores.material_cat_ids + ',' LIKE '%,' + CONVERT(varchar(100), material_category.material_cat_id) + ',%'
于 2012-07-05T08:57:02.277 に答える