Поворот Oracle запрос - PullRequest
       0

Поворот Oracle запрос

1 голос
/ 29 января 2020

У меня есть следующие таблицы:

Items
______
Item_ID
Item_Name
...


Properties
___________
Item_ID
Property_ID
Property_Value_ID

PropertyTypes
_______________
Property_Type_ID
Property_Type_Name


PropertyValues
_______________
Property_Type_ID
Value_ID
Value_Name

и запрос

SELECT pt.PROPERTY_TYPE_NAME, pv.VALUE_NAME
FROM Property_Types pt, PropertyValues pv, Properties p
WHERE pt.PROPERTY_TYPE_ID = pv.PROPERTY_TYPE_ID
AND pv.VALUE_ID = p.PROPERTY_VALUE_ID
AND p.ITEM_ID = 1;

Это дает мне 3 строки для каждого из трех свойств, но мне нужна одна строка, где PROPERTY_TYPE_NAME это имя столбца и PROPERTY_VALUE в качестве значения столбца

что у меня есть

 Column1|Column2 |Column3| Column4|Column5| Column6
 Type1  | Value1 | Type2 | Value2 | Type3 | Value3

что мне нужно это

Type1  | Type2 | Type3
Value1 | Value2| Value3

1 Ответ

1 голос
/ 29 января 2020

Вы можете выполнить условное агрегирование:

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...