基于多个类别的过滤

时间:2018-08-20 19:13:17

标签: sql oracle

我的搜索根据以下列出的多个类别进行过滤,以查找属于A-F类别但同一类别中没有多于一项的任何记录。我会尝试用一个例子来解释。

A Bread
B Apple 
C Strawberry OR Blueberry OR Raspberry
D Watermelon OR Muskmelon OR Honeydew
E Papaya
F Oranges OR Peaches OR Nectarines



T1:
1
2
3
4
5
6
7

T2:
ID  Category
1   Bread
2   Apple 
2   Strawberry 
3   Blueberry 
3   Raspberry
4   Watermelon 
5   Muskmelon 
5   Honeydew
4   Papaya
2  Oranges 
1  Peaches 
5  Nectarines

在上述情况下,我的搜索将返回:

1 Bread,Peaches
2 Apple,Strawberry, Oranges
4 Watermelon,Papaya

3和5属于同一类别的商品-

#3: Blueberry and Raspberry
#5: Muskmelon, Honeydew and Nectarines

1 个答案:

答案 0 :(得分:0)

首先,您需要一个表-称为CATEGORY_GROUPS ( category, category_group )-来关联您帖子中的这些信息:

A Bread
B Apple 
C Strawberry OR Blueberry OR Raspberry
D Watermelon OR Muskmelon OR Honeydew
E Papaya
F Oranges OR Peaches OR Nectarines

例如,其中“面包”将是类别,而“ A”将是类别组。

然后,在查询中将t1t2category_groups连接在一起,以便获得每个项目,其类别和类别组。然后按id分组。

关键部分是如何限制重复项。如果存在重复项,那么不同类别组的数量将少于类别数量。因此,您可以在HAVING子句中使用该条件来获取所需的内容。

就像这样应该起作用:

SELECT t1.id, listagg(t2.category,',') within group ( order by category )
FROM  t1 inner join t2 on t2.id = t1.id
inner join category_groups cg on cg.category = t2.category
GROUP BY t1.id
HAVING COUNT(DISTINCT cg.category_group) < COUNT(DISTINCT t2.category)