从2个表中选择有条件绑定的列成一行

时间:2019-01-16 13:50:11

标签: sql postgresql

我进行了搜索,但似乎找不到合适的关键字来描述我要实现的目标,因此,如果这是一个已知问题,请宽容,只需将我指向正确的关键字即可。

我有以下表格/条目:

select * from personnes where id=66;

id | aclid | referendid |     login      | validated |    passwd                            
66 |       |            | toto@tiiti.com | f         | $2y$10$w3DRh/g2Tebu/mkMcQz32OUB.dDjFiBP99vWlMrrPWpR45JZDdw4W

 select * from pattributs where (name='nom' OR name='prenom') AND persid=66;

 id |  name  | value | persid 
----+--------+-------+--------
 90 | prenom | Jean  |     66
 91 | nom    | Meyer |     66

现在,我使用该表格来使主表不混乱,因为根据情况,我是否记录名称。...

但是将视图作为已完成表格的表格会很好,所以我尝试:

select (personnes."id","login",
    (select "value" from pattributs where "name"='nom' AND "persid"=66),
    (select "value" from pattributs where "name"='prenom' AND "persid"=66)
    ) from personnes where personnes.id=66;

这似乎可以做到:

             row               
--------------------------------
 (66,toto@tiiti.com,Meyer,Jean)

但是列标签消失了,能够从调用的php脚本中获取它们非常有用,但是当我添加时:

 select (personnes."id","login",
          (select "value" from pattributs where "name"='nom' AND "persid"=66),
         (select "value" from pattributs where "name"='prenom' AND "persid"=66) as 'prenom') 
   from personnes where personnes.id=66;

我在as指令处收到语法错误...所以我可能不了解如何正确执行此操作,大括号表示这已不再以表格形式出现),那么如何获得以下结果:

id | login         | nom   | prenom
66 |toto@tiiti.com | Meyer | Jean

想法是为每个用例存储一个合适的视图,仅捆绑相关列。

预先感谢

1 个答案:

答案 0 :(得分:1)

要回答您的问题:您正在丢失列名称,因为您正在创建一个简单的数据集(一行)。这是由您的牙套完成的。没有它们,您应该会得到预期的结果。


但是您的解决方案不是很好:您应该避免在每个子查询中计算单个列。只需一个SELECT即可轻松完成:

select
    pe.id,
    pe.login,
    MIN(pa.value) FILTER (WHERE pa.name = 'nom') as nom,
    MIN(pa.value) FILTER (WHERE pa.name = 'prenom') as prenom
from 
    personnes pe
join pattributs pa ON pe.id = pa.persid AND pe.id = 66
where pa.name = 'nom' or pa.name = 'prenom'
group by pe.id, pe.login

首先,您需要一个JOIN才能将两个表的正确数据集组合在一起。您应该加入id

然后您会遇到一个问题,即您的名称有两行(这似乎设计得不太好,为什么没有两列?)。这两个值可以按id分组。现在您可以汇总它们。

我正在做的是“聚合”它们(我使用的函数无关紧要,因为它应该只是一个值)。 FILTER子句过滤出正确的值。