如果您使用的子字符串匹配(即使用INSTR()
或LIKE
)則是製造部分匹配的問題(即item1
是item11
一個子),你需要處理這種情況。
假設你使用的是永遠不會是產品標識的組成部分的分隔符,那麼你可以使用:
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)
);
來源
2016-06-27 09:35:46
MT0
感謝您的建議。它按預期工作:) – MKN
@MKN如果你有'item1'和'item13',它將不起作用。 – MT0
@ MT0:請讓我知道在這種情況下的原因和做法。 – MKN