2017-02-03 4 views
1

У меня есть две таблицы с одним из них - вертикальные, т. Е. Хранятся только пара значений ключа с идентификатором ref из таблицы 1. Я хочу присоединиться к таблице как таблица, Выбрать. а также выполнять сортировку по нескольким клавишам. T1, имеющая (идентификатор, EmpID, диоптрия) T2, имеющая (EmpID, ключ, значение)Как присоединиться к таблице вертикальных и горизонтальных таблиц

select 
    T1.*, 
    t21.value, 
    t22.value, 
    t23.value, 
    t24.value 

from Table1 t1 
join Table2 t21 on t1.empid = t21.empid 
join Table2 t22 on t1.empid = t22.empid 
join Table2 t23 on t1.empid = t23.empid 

where 
     t21.key = 'FNAME' 
    and t22.key = 'LNAME' 
    and t23.key='AGE' 
+1

Возможный дубликат [PostgreSQL перекрестный запрос] (http://stackoverflow.com/questions/3002499/postgresql-crosstab-query) –

ответ

1

Запроса вы демонстрируете очень неэффективен (другие присоединиться к каждому колонку), а также имеет потенциальную проблему: если не является строкой в ​​T2 для каждый ключ в предложении WHERE, вся строка исключена.

Вторая проблема может быть устранена с помощью LEFT [OUTER] JOIN вместо [INNER] JOIN. Но не беспокойтесь, решение первой проблемы - совершенно другой запрос. "Стержень" T2 использованием crosstab():

SELECT * FROM crosstab(
     'SELECT empid, key, value FROM t2 ORDER BY 1' 
    , $$VALUES ('FNAME'), ('LNAME'), ('AGE')$$ -- more? 
    ) AS ct (empid int  -- use *actual* data types 
      , fname text 
      , lname text 
      , age text); 
      -- more? 

Тогда просто присоединиться к T1:

select * 
from t1 
JOIN (<insert query from above>) AS t2 USING (empid); 

На этот раз вы можете использовать [INNER] JOIN.

Статья USING удобно удаляет второй экземпляр столбца empid.

Подробные инструкции:

+0

Благодаря Эрвин для помогает. Я получил свой ответ. – ArmStrong

+0

@Thoma: Прохладный. Если это ответит на ваш вопрос, [подумайте о его принятии] (http://meta.stackexchange.com/a/5235/169168). –