2016-06-27 45 views
0

我有一個場景,我需要連接兩個值並查找材質描述。加入兩個值以獲取其他表中的描述-SQL

Product table : 
------------- 
PRODUCT SUGGESTIONS 
item1  item2 
item1  item3 
item1  item3&item4 
item1  item2&item3 

Product Master table: 
-------------------- 

PRODUCT  DESC 
item1  EBIKE 
item2  BIKE TOOLS 
item3  BIKE PAINT 
item4  Regular Bike 

輸出應該

PRODUCT SUGGESTIONS PRODUCT DESC 
item1  item2   BIKE TOOLS 
item1  item3   BIKE PAINT 
item1  item3&item4 BIKE PAINT& Regular Bike 
item1  item2&item3 BIKE TOOLS&BIKE PAINT 

我不知道如何連接這兩個表。請建議。

回答

2

如果您使用的子字符串匹配(即使用INSTR()LIKE)則是製造部分匹配的問題(即item1item11一個子),你需要處理這種情況。

假設你使用的是永遠不會是產品標識的組成部分的分隔符,那麼你可以使用:

SELECT PT.PRODUCT, 
     PT.SUGGESTIONS, 
     LISTAGG(PM.DESC, '&') WITHIN GROUP (ORDER BY PM.DESC) 
     AS PRODUCT_DESC 
FROM PRODUCT PT 
     INNER JOIN 
     PRODUCTMASTER PM 
     ON ('&'||PT.SUGGESTIONS||'&' LIKE '%&'||PM.PRODUCT || '&%') 
GROUP BY PT.PRODUCT, PT.SUGGESTIONS 

但是一個更好的解決辦法是將產品和建議適當分離成單獨的表:

CREATE TABLE products (
    id  NUMBER(8,0) CONSTRAINT product__id__pk PRIMARY KEY, 
    product VARCHAR2(20) CONSTRAINT product__product__u UNIQUE 
); 

CREATE TABLE suggestions (
    id   NUMBER(8,0) CONSTRAINT product_suggestions__id__pk PRIMARY KEY, 
    product_id NUMBER(8,0) CONSTRAINT product_suggestions__pid__fk 
            REFERENCES products (id) 
          CONSTRAINT product_suggestions__pid__nn NOT NULL 
); 

CREATE TABLE product_suggestions (
    suggestion_id NUMBER(8,0) CONSTRAINT product_suggestions__sid__fk 
             REFERENCES suggestions (id), 
    product_id NUMBER(8,0) CONSTRAINT product_suggestions__sid__fk 
             REFERENCES product (id), 
    CONSTRAINT product_suggestions__pk PRIMARY KEY (suggestion_id, product_id) 
); 
1

首先,這不是一個好的餐桌設計。您使用的表單對於規範化規則不正常。

這可能適用於這種情況。

SELECT PT.PRODUCT, PT.SUGGESTIONS, LISTAGG(PM.DESC, '&') WITHIN GROUP (ORDER BY PM.DESC) AS PRODUCT_DESC 
FROM PRODUCT PT, PRODUCTMASTER PM 
WHERE INSTR(PT.SUGGESTIONS,PM.PRODUCT) != 0 
GROUP BY PT.PRODUCT, PT.SUGGESTIONS 
+1

感謝您的建議。它按預期工作:) – MKN

+0

@MKN如果你有'item1'和'item13',它將不起作用。 – MT0

+0

@ MT0:請讓我知道在這種情況下的原因和做法。 – MKN