我试过在类似的问题上查找这个,但它们似乎不等价。
我试图从表中删除较小的子集组,无论组中值的顺序如何。因此,保留较大的组,删除较小的组,只要它们是较大组的子集。
Group Item
1 A
1 B
1 C
1 D
2 B
2 A
3 B
3 E
3 A
4 Z
4 W
4 Y
在这个例子中,由于第1组是最大的,我想保留它。我也想保留第4组,因为它不是另一组的子集。但我想删除组2(因为它是组1的子集(,但不删除组3(因为它不是完整的子集(。
我还将提到的是,数据是巨大的;项目";或";组";值将为,所以我不能使用特定值进行查询。
您可以将父组和子组的对获取为:
select t1.group as parent_group, t2.group as childgroup
from t t2 left join
t t1
on t1.item = t2.item and t1.group <> t2.group
group by t1.group, t2.group
having count(t1.item) = (select count(*) from t tt1 where tt1.group = t1.group);
这将检查子对象(t2
(中的所有内容是否都在父对象(t1
(中。
如果您知道没有相同的组,则可以删除所有子组。如果它们可以相同,则将having
更改为:
having count(t1.item) = (select count(*) from t tt1 where tt1.group = t1.group) and
count(*) <> count(t1.item) -- not an exact match