如何将垂直和水平表连接在一起



我有两个表,其中一个是垂直的,即仅存储具有表 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 交叉表查询

最新更新