我有两个表,其中一个是垂直的,即仅存储具有表 1 中引用 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'
您演示的查询效率非常低(每个附加列都有另一个联接),并且还存在一个潜在问题:如果 WHERE
子句中的每个键都没有T2
行,则排除整行。
第二个问题可以用LEFT [OUTER] JOIN
而不是[INNER] JOIN
来避免。但不要打扰,第一个问题的解决方案是一个完全不同的查询。"透视"T2
使用附加模块tablefunc
中的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
列的第二个实例。
详细说明:
- PostgreSQL 交叉表查询