2017-02-03 6 views
1

私はそれらのうちの1つを持つ2つのテーブルが縦になっています。つまり、テーブル1のref idを持つキー値のペアのみを格納します。選択します。いくつかのキーでソートを実行することもできます。そこの場合: T1は、あなたが証明クエリは非常に非効率的である(他の列ごとに参加)と、潜在的な問題を抱えている(ID、EMPID、DPT) 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節のすべてがの場合、行全体が除外されます。

[INNER] JOINの代わりにLEFT [OUTER] JOINを使用すると、2番目の問題を回避できます。しかし、気にしないで、最初の問題の解決策は全く異なるクエリです。 crosstab()を使用して、 "ピボット" T2

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列の2番目のインスタンスを削除します。

詳細な手順:

+0

おかげアーウィンのために助けて私は私の答えを得た。 – ArmStrong

+0

@トーマス:クール。それがあなたの質問に答えるなら、[それを受け入れることを検討する](http://meta.stackexchange.com/a/5235/169168)。 –

関連する問題