2015-03-02 55 views
0

我在主 - 关系关系中获得了两个表,并希望在单个选择查询中选择所有数据。字段值作为PostgreSQL中主详细信息的列

表 “人”:

id;name 
1;Allen 
2;Bert 
3;Chris 

表 “连接”:

id;personId;type;value 
1;1;phone;+123456789 
2;1;mail;[email protected] 
3;2;mail;[email protected] 
4;3;phone;+987654321 
5;3;fax;+987654322 

查询输出应该是这样的

person.id;person.name;phone;mail;fax 
1;Allen;+123456789;[email protected]; 
2;Bert;;[email protected]; 
3;Chris;+987654321;;+987654322 

任何想法可能不写了一些功能? 它应该在细节表扩展时动态地添加柱。例如。在细节表中添加一行,如

6;2;icq;

我的首选解决方案适合选择查询。

谢谢! Patrick

回答

1

这是不可能将列添加到静态SQL查询。

您正在使用的模式被称为“实体 - 属性 - 值模型”。你可以谷歌了解其不同实现的细节。

SQL中每个对象具有许多动态属性的唯一“简单”方法是将它们全部转储为HSTORE,JSON(B),BLOB等单个结构...在这种情况下,输出将魔神一样:

id;name;params 
1;Allen;{"phone":"+123456789", "email":"[email protected]"}; 
2;Bert;{"email":"[email protected]"}; 
3;Chris;{"phone":"+987654321", "fax":"+987654322"}; 
+0

喜伊戈尔,感谢您的回答,它给了我为我的解决方案的提示。我决定使用数组。对我来说似乎是最接近的方式。 对于它可能涉及的人:我在列和array()函数中使用了子查询。 – Patrick 2015-03-03 07:21:32

0

您需要一个JOIN和一个CASE来选择所需的值。事情是这样的:

SELECT person.id, 
    person.name, 
    CASE connectivity.type WHEN 'phone' THEN value END AS phone, 
    CASE connectivity.type WHEN 'mail' THEN value END AS mail, 
    CASE connectivity.type WHEN 'fax' THEN value END AS fax 
FROM person 
    JOIN connectivity ON person.id = connectivity.personId; 

Offtopic:不要使用大写的组合和较低的情况下,PostgreSQL只,除非你把“双引号”之间的一切使用小写。

0
select 
p.name, 
phone.value phone, 
mail.value mail 
from person p 
left join connectivity phone on phone.personid = p.id and phone.type = 'phone' 
left join connectivity mail on mail.personid = p.id and mail.type = 'mail'