Вы можете использовать оператор PIVOT
- и только table2
абсолютно необходим:
SELECT * FROM (
SELECT column1, column2, column3, ..., attribute_name, attribute_value
FROM table2
) PIVOT (
MAX(attribute_value)
FOR attribute_name IN ('ENTITY_ID' AS entity_id, 'ACTIVATION_DATE' AS activation_date)
)
ORDER BY column1;
См. Рабочую скрипту SQL здесь .
Обратите внимание, что MAX()
в PIVOT
существует только потому, что PIVOT
ожидает агрегатную функцию. MIN()
будет работать так же хорошо (есть только одно значение).
Надеюсь, это поможет.
РЕДАКТИРОВАТЬ: Только что увидел ваш комментарий о многих других столбцах в table1
, что вам нужно. В этом случае вам понадобится что-то вроде следующего:
SELECT * FROM (
SELECT t1.column1, t1.column2, t1.column3, ..., t2.attribute_name, t2.attribute_value
FROM table1 t1 INNER JOIN table2 t2
ON t1.column1 = t2.column1
AND t1.column2 = t2.column2
AND t1.column3 = t2.column3
) PIVOT (
MAX(attribute_value)
FOR attribute_name IN ('ENTITY_ID' AS entity_id, 'ACTIVATION_DATE' AS activation_date)
)
ORDER BY column1;
РЕДАКТИРОВАТЬ # 2: Если вам нужно преобразовать ACTIVATION_DATE
в фактическую дату, вы можете сделать что-то вроде следующего:
SELECT column1, column2, column3, ..., entity_id
, TO_DATE(activation_date, 'ddmmyyyy') AS activation_date
FROM (
SELECT t1.column1, t1.column2, t1.column3, ..., t2.attribute_name, t2.attribute_value
FROM table1 t1 INNER JOIN table2 t2
ON t1.column1 = t2.column1
AND t1.column2 = t2.column2
AND t1.column3 = t2.column3
) PIVOT (
MAX(attribute_value)
FOR attribute_name IN ('ENTITY_ID' AS entity_id, 'ACTIVATION_DATE' AS activation_date)
)
ORDER BY column1;
Но если вы храните даты в виде строк, преобразование может быть небезопасным на 100%.