2012-07-05 88 views
0

我有兩個表:選擇查詢,聯合其他表號字段集合場

表:商店

---------------------------------------------- 
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 

現在我需要加入在兩個表(storesmaterial_category)之間。以stores作爲集合具有material_cat_idsmaterial_category表具有作爲數字字段的material_cat_id,我不能使用「in」關鍵字。

請建議加入這些表的最佳方式。

回答

0

也許這樣?

select * 
from stores 
inner join material_category 
on ',' + stores.material_cat_ids + ',' LIKE '%,' + CONVERT(varchar(100), material_category.material_cat_id) + ',%' 
3

將您的材料類別ID存儲爲字符串是一個可怕的想法。如果還不算太晚,請回到繪圖板!你正在破壞關係數據庫的目的。一個更好的表結構將是一個新的表所示:

StoreMaterialCategory

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

然後得到從商店擺脫Material_Cat_IDs的。我已經舉了一個示例模式Here以及一些演示查詢來展示如何獲得您可能需要的2個輸出。

但是,如果你堅持這個表結構,那麼你可以像這樣聯接:

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

Example On SQL Fiddle

編輯

如果你需要在一個類別您可以使用的列表:

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; 

Example

+0

感謝的建議,我應該改變我的結構,它是對我好 –

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); 

output

摸索出示例SQLFIDDLE