数据库逻辑,查询具有重复值的表

时间:2012-09-12 16:26:11

标签: sql database

对不起,我很难想出一个描述性的标题。

我有一个带有复合键的两列表 - > ID和属性。 因此,id可能会在表中出现两次,但每个实例都有不同的属性。

id    attribute
1     1
1     2
2     2
3     1

我的问题是如何查询。例如,我想找到所有匹配两个属性的ID

SELECT a.id
FROM   table AS a, table AS b
WHERE  a.attribute = 1
AND    b.attribute = 2
AND    a.id = b.id

因此,此查询应仅返回id 1。

这非常严格,因为我需要知道我将提前搜索多少属性,尽管动态创建SQL可能是可能的。

有没有更好的方法来查询这样的表格?是否有更好的方法来构建此表?

感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

SELECT id
FROM   table
WHERE  attribute in (1,2)
group by id
having count(id) = 2

这假设同一属性只能为id分配一次(组合id /属性是唯一的)

SQLFiddle example

答案 1 :(得分:0)

您可以执行表旋转并创建数据的平面视图,如下所示。缺点是您必须对结果中的列数施加固定限制。这是一个例子:

create view flat_attributes
as
select id ,
       attr_1 = t1.attribute ,
       attr_2 = t2.attribute ,
       attr_3 = t3.attribute ,
       ...
       attr_N = tN.attribute
from ( select distinct
              id
       from attributes
     ) t
left join attributes t1 on t1.id = t.id and t1.attribute = 1
left join attributes t2 on t2.id = t.id and t1.attribute = 2
left join attributes t3 on t3.id = t.id and t1.attribute = 3
...
left join attributes tN on tN.id = t.id and tN.attribute = N

非空的任何attr列表示相关的id具有该属性。它应该简化查询。