2015-03-02 57 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'