2012-12-19 45 views
2

是否可以转置具有重复列的表?转置表具有相同属性的“列表”

现有表:

user_id question_id body 
1   1    'Text1 1' 
1   1    'Text1 1-2' 
1   2    'Text1 2' 
1   3    'Text1 3' 
2   1    'Text2 1' 
2   2    'Text2 2' 

交叉选项卡或解决方案基于

MAX(CASE WHEN r.question_id = 1 THEN r.body ELSE NULL END) AS 'question1' 

并不适用于这种情况,因为总是重复属性的匹配最后一次出现。

我想对问题主体执行搜索,但我不知道如何没有转置表。
例如我想查找user_id,其中question1='...' AND question2='...'

+0

这是什么RDBMS? –

+0

目标数据库是postgresql –

回答

1

这是关系部门的一个案例。两个示例查询技术,让你想要什么:

SELECT user_id 
FROM tbl 
WHERE question_id = 1 
AND body = 'Text1 1' 

INTERSECT 
SELECT user_id 
FROM tbl 
WHERE question_id = 2 
AND body = 'Text1 2'; 

或者:

SELECT t1.user_id 
FROM tbl t1 
JOIN tbl t2 USING (user_id) 
WHERE t1.question_id = 1 
AND t1.body = 'Text1 1' 
AND t2.question_id = 2 
AND t2.body = 'Text1 2'; 

-> sqlfiddle demo

找到更多根据此相关的问题:
How to filter SQL results in a has-many-through relation

crosstab()从附加模块tablefunc只是一种方式以修改的方式显示您的数据。但是你正在寻找一种查询技术。这不是一个显示问题。
你也可以在SO上找到很多crosstab()的例子,a search like this one

+0

感谢这就是我正在寻找。我必须找出哪种技术执行起来更便宜(基于1..10个属性进行搜索) 技巧“MAX(CASE when ...”对我有好处,如果对于“group by”实体(这里是user_id)存在最大出现一个属性(attribute_id),所以首先你转置表并且你可以执行搜索 –

+0

我不知道它是否是好的设计..我读了一些关于它的文章,这种问题被称为“实体属性值“模型..你可以很容易地扩展与另一个问题的模型,但它对搜索有不良影响..你有这方面的一些材料吗?像”Tuning \ Optimialization EAV模型“等。?我有非常不好的经验解决这类问题.. –

+0

@JohnMahn:在处理EAV时,您可能对[hstore](http://www.postgresql.org/docs/current/interactive/hstore.html)模块感兴趣。搜索[EAV here on SO](http://stackoverflow.com/que stions/tagged/entity-attribute-value),或者几个[非常有趣的dba.SE答案](http://dba.stackexchange.com/questions/tagged/eav)。 –

相关问题