2016-04-14 8 views
0

У меня есть таблица, в которой хранятся идентификатор, идентификатор поля и значение, которое следует вместе с ним в каждой строке. Таблица выглядит примерноСоздание одной строки из нескольких строк

create table personInfo(
    personName varchar2(100), 
    fieldName varchar2(100), 
    fieldValue varchar2(100) 
) 
/
insert into personInfo values('Adam', 'Address', '123 Cool Street'); 
insert into personInfo values('Adam', 'Height', '6 foot 1 inch'); 
insert into personInfo values('Adam', 'Hair Color', 'Blonde'); 
insert into personInfo values('Bob', 'Address', '451 Fake Street'); 
insert into personInfo values('Bob', 'Car Model', '2016 Prius'); 
insert into personInfo values('Bob', 'Hair Color', 'Brown'); 

Теперь, если я знаю имена полей, которые я хочу, но я бы хотел, чтобы вернуть его в один ряд, а не совокупность строк, как я могу получить их обратно? Таким образом, в этом случае, я хотел бы результат

NAME ADDRESS   HEIGHT   HAIR COLOR CAR MODEL 
___________________________________________________________________ 
Adam 123 Cool Street 6 foot 1 inch  Blonde  null 
Bob  451 Fake Street null    Brown   2016 Prius 

Вот что у меня до сих пор

with tab as 
(select personName, fieldName, fieldValue from personInfo where personName = 'Adam') 
select * 
    from (select (select fieldValue as address from tab where fieldName = 'Address') from dual) t1, 
     (select (select fieldValue as height from tab where fieldName = 'Height') from dual), 
     (select (select fieldValue as hairColor from tab where fieldName = 'Hair Color') from dual), 
     (select (select fieldValue as carModel from tab where fieldName = 'Car Model') from dual); 

Но это возвращает только одну строку, и без имени либо. Кто-нибудь знает, возможно ли это?

+4

Вы должны изучить 'PIVOT' – Siyual

+0

Знаете ли вы, что во время компиляции заданы значения' fieldName', которые вы хотите ссылаться? Или вы хотите, чтобы в результате появился дополнительный столбец, если кто-то вставил атрибут цвета для Адама? Тип данных, который у вас здесь, очень гибкий, но он будет медленным и болезненным для запроса. –

+0

Я знаю, во время компиляции, что я ищу эти точные столбцы. – Coat

ответ

2

Если у вас есть предопределенный список имен полей, вы можете попробовать это.

SELECT * FROM 
    (SELECT personName, Fieldname, fieldValue 
     FROM personInfo) AS t 
    pivot 
    (
     MAX(t.fieldValue) 
     FOR fieldname IN (ADDRESS, HEIGHT, [HAIR COLOR], [CAR MODEL]) 
    ) AS pvt 

Если этот список не задан, вы можете попробовать использовать Dynamic Sql для создания своего стержня. Like This.

+0

Бум, ты прибил его мужчине! Огромное спасибо. – Coat

+0

В какой версии Oracle это работает? С «как» перед псевдонимом для таблицы и именами сводных столбцов, не заключенными в одинарные кавычки? Кто-нибудь из вас ТЕСТИРОВАЛ это? – mathguy

+0

Oracle 11g, я просто удалил, чтобы заставить его работать. – Coat

Смежные вопросы