我有两个表,Data(Name, dataID)
和Attributes(Name, attributeID, dataID)
,一对多的关系。一个dataID
可能与许多attributeID
相关联。
我想要做的是运行一个查询,查找具有一组特定属性ID的所有数据ID。我不能这样做:
SELECT dataID
FROM Attributes
WHERE dataID = 1 AND (attributeID = 1 OR attributeID = 2 OR attributeID = 3);
那将使用这些属性中的任何一个获取所有dataID,我希望dataID具有所有这些属性。
建议?
仍然围绕使用超过非常基本的选择的查询。
答案 0 :(得分:1)
虽然这是一个强力解决方案,但它可以使用EXISTS
。等待更好的解决方案。
SELECT a.dataID
FROM DataID a WHERE a.dataID = 1
AND EXISTS (SELECT 1 FROM Attributes d WHERE d.DataID = 1 AND d.attributeID = 1)
AND EXISTS (SELECT 1 FROM Attributes d WHERE d.DataID = 1 AND d.attributeID = 2)
AND EXISTS (SELECT 1 FROM Attributes d WHERE d.DataID = 1 AND d.attributeID = 3)
可以使用GROUP BY
解决方案。
SELECT dataID
FROM Attributes
WHERE dataID = 1 AND (attributeID = 1 OR attributeID = 2 OR attributeID = 3)
GROUP BY dataID
HAVING COUNT(*) = 3
答案 1 :(得分:1)
由于您需要阅读Attributes
表的三个不同行,我建议使用JOIN
来避免子查询。
SELECT a1.dataID
FROM
Attributes a1
JOIN Attributes a2 ON
a1.dataID=a2.dataID
JOIN Attributes a3 ON
a2.dataID=a3.dataID
WHERE
a1.dataID = 1 AND
a1.attributeID = 1 AND
a2.attributeID = 2 AND
a3.attributeID = 3;