如果你的SQL执行缺乏转/交叉功能,您还可以通过展开/ denormalise的EAV:
SET search_path='tnp';
-- create some data ...
CREATE TABLE value
(id INTEGER NOT NULL
, attribute varchar
, value varchar
, PRIMARY KEY (id,attribute)
);
INSERT INTO value(id,attribute,value) VALUES
(1 ,'Lab1', 'Value1-1')
, (1 ,'Lab2', 'Value1-2')
, (1 ,'Lab3', 'Value1-3')
, (1 ,'Lab4', 'Value1-4')
, (1 ,'Lab5', 'Value1-5')
, (1 ,'Lab6', 'Value1-6')
, (2 ,'Lab1', 'Value2-1')
, (2 ,'Lab2', 'Value2-2')
, (2 ,'Lab3', 'Value2-3')
, (2 ,'Lab4', 'Value2-4')
, (2 ,'Lab5', 'Value2-5')
, (2 ,'Lab6', 'Value2-6')
;
SELECT v.id
, l1.value AS lab1
, l2.value AS lab2
, l3.value AS lab3
, l4.value AS lab4
, l5.value AS lab5
, l6.value AS lab6
FROM value v
LEFT JOIN value l1 ON l1.id = v.id AND l1.attribute = 'Lab1'
LEFT JOIN value l2 ON l2.id = v.id AND l2.attribute = 'Lab2'
LEFT JOIN value l3 ON l3.id = v.id AND l3.attribute = 'Lab3'
LEFT JOIN value l4 ON l4.id = v.id AND l4.attribute = 'Lab4'
LEFT JOIN value l5 ON l5.id = v.id AND l5.attribute = 'Lab5'
LEFT JOIN value l6 ON l6.id = v.id AND l6.attribute = 'Lab6'
;
我同意:这是不是很优雅。但它的工作。
您正在查找[crosstab query](http://www.postgresql.org/docs/9.1/static/tablefunc.html)。 – mzedeler 2012-04-21 22:15:54