т.к. набор характеристик может быть совершенно разнообразным, а известен нам только товар (его id), то сопоставлять необходимо по набору характеристик и их кол-ву, т.е. объединяем таблицу саму с собой, из первой выбираем наш продукт и по его набору характеристик соединяем со второй, при этом исключаем исходный товар из второй, как-то так:
WITH param AS (
SELECT 5 AS prod_id -- ИД продукта которому ищем сопутствующие
)
SELECT p2.prod_id
FROM param, prod_ch_val p1, prod_ch_val p2
WHERE p1.prod_id = param.prod_id -- ИД продукта
AND p1.ch_id=p2.ch_id
AND p1.val = p2.val
AND p1.prod_id != p2.prod_id
AND (SELECT count(1) FROM prod_ch_val t WHERE t.prod_id=p2.prod_id) = (SELECT count(1) FROM prod_ch_val t WHERE t.prod_id=p1.prod_id)
GROUP BY p2.prod_id
пример
идентичные товары:
1 и 3
2 и 5
4 - не идентичен ни с кем.
PS: выражение WITH можно убрать и подставлять ID товара непосредственно в запрос вместо param.prod_id
сделал для удобства