我有两个表,其中一个是垂直的,即只存储来自表1的ref id的键值对。我想将表和显示键值对作为select中的列连接。并且还在几个键上执行排序。 T1有(id,empid,dpt) T2有(empid,key,value)
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'
答案 0 :(得分:1)
您演示的查询效率非常低(每列的另一个连接)并且还存在潜在问题:如果T2
中的中的每个键都没有行{1}}子句,排除整行。
使用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
列的第二个实例。
详细说明: