Я думаю, я бы построил функцию и пошел бы по маршруту пересечения.Я думаю, вы могли бы также создать строку, чтобы связать каждую группу со значением, представляющим все данные группы.Затем примените ту же функцию к вашей группе кандидатов и проверьте соответствие элементов.Вот пример возможной аггегации Postgresql:
SELECT g.groupid, array_to_string(g.element_array, ',') elements
FROM (SELECT o.groupid, array_agg(o.element_name ||'='|| o.element_value) AS element_array
FROM (SELECT groupid, element_name, element_value
FROM composition
ORDER BY 1, 2) o
GROUP BY groupid) g
ORDER BY groupid
groupid | elements
---------+---------------------------------------
g1 | Material=A,Temperature=37
g2 | Color=white,Material=B,Temperature=50
g3 | Material=C
g4 | Color=Red
Внутренний порядок должен гарантировать, что он генерирует последовательно.Кажется, Oracle 11gR2 имеет функцию LISTAGG для конкатенации строк, которая может быть полезна.Или вы можете создать собственную агрегатную функцию для этого.Если эти данные относительно статичны, вы, возможно, захотите предварительно вычислить и сохранить при вставке, а не перегенерировать с каждым запросом.