对不起,我很难想出一个描述性的标题。
我有一个带有复合键的两列表 - > 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可能是可能的。
有没有更好的方法来查询这样的表格?是否有更好的方法来构建此表?
感谢您的帮助。
答案 0 :(得分:2)
SELECT id
FROM table
WHERE attribute in (1,2)
group by id
having count(id) = 2
这假设同一属性只能为id分配一次(组合id /属性是唯一的)
答案 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
具有该属性。它应该简化查询。