Вы можете выполнить условное агрегирование:
SELECT
MAX(CASE WHEN pt.PROPERTY_TYPE_NAME = 'Type1' THEN pv.VALUE_NAME END) type1,
MAX(CASE WHEN pt.PROPERTY_TYPE_NAME = 'Type2' THEN pv.VALUE_NAME END) type2,
MAX(CASE WHEN pt.PROPERTY_TYPE_NAME = 'Type3' THEN pv.VALUE_NAME END) type3
FROM
Property_Types pt
INNER JOIN PropertyValues pv ON pt.PROPERTY_TYPE_ID = pv.PROPERTY_TYPE_ID
INNER JOIN Properties p ON pv.VALUE_ID = p.PROPERTY_VALUE_ID
WHERE p.ITEM_ID = 1;
Примечание: всегда использовать явные стандартные объединения (с синтаксисом JOIN ... ON ...
) вместо неявных неявных объединений старой школы ( с запятыми в предложении FROM
), синтаксис которого потерял популярность после ANSI SQL 92. Я изменил ваш запрос соответствующим образом.
Обратите внимание, что вы можете слегка изменить запрос, чтобы он мог обрабатывать более по одному ITEM_ID
за раз:
SELECT
p.ITEM_ID,
MAX(CASE WHEN pt.PROPERTY_TYPE_NAME = 'Type1' THEN pv.VALUE_NAME END) type1,
MAX(CASE WHEN pt.PROPERTY_TYPE_NAME = 'Type2' THEN pv.VALUE_NAME END) type2,
MAX(CASE WHEN pt.PROPERTY_TYPE_NAME = 'Type3' THEN pv.VALUE_NAME END) type3
FROM
Property_Types pt
INNER JOIN PropertyValues pv ON pt.PROPERTY_TYPE_ID = pv.PROPERTY_TYPE_ID
INNER JOIN Properties p ON pv.VALUE_ID = p.PROPERTY_VALUE_ID
GROUP BY p.ITEM_ID;