0

很抱歉,很难想出一个描述性的标题。

我有一个带有复合键的两列表——> ids 和属性。因此,一个 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 可能是可能的。

有没有更好的方法来查询这样的表?首先有没有更好的方法来构建这个表?

谢谢你的帮助。

4

2 回答 2

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

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

SQLFiddle 示例

于 2012-09-12T16:32:38.037 回答
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问题的列具有该属性。它应该简化查询。

于 2012-09-12T16:42:28.517 回答