我有一个简单的SQL关系模型,具有多对多的关系。这是组合表
___________________________ | object1_id | object2_id | |---------------------------|
我想知道一组object1
共有的所有object2
。我的基本感觉是做这样的请求
SELECT c.object1_id FROM composition c WHERE c.object2_id = <given_id_1>
INTERSECT
SELECT c.object1_id FROM composition c WHERE c.object2_id = <given_id_2>
如果我在集合中有N个对象2,我会做N INTERSECT
SELECT c.object1_id FROM composition c WHERE c.object2_id = <given_id_1>
INTERSECT
SELECT c.object1_id FROM composition c WHERE c.object2_id = <given_id_2>
...
INTERSECT
SELECT c.object1_id FROM composition c WHERE c.object2_id = <given_id_N>
但是,它看起来并不是非常优化。你能帮助我吗 ?我不是一个真正的SQL专家。我想我可以使用JOIN来做到这一点。
示例
___________________________ | object1_id | object2_id | |---------------------------| | 10 | 1 | | 11 | 1 | | 10 | 2 | | 12 | 2 | | 10 | 3 | | 11 | 3 | | 13 | 3 |
示例
object2_id
set} =&gt; {expected object1_id
} 答案 0 :(得分:2)
在性能方面,您的查询看起来不错。你有没有测量它是否确实存在问题?
如果(object1_id, object2_id)
是唯一的,那么您可以更简洁地编写查询,如下所示:
SELECT object1_id
FROM composition
WHERE object2_id IN (id1, id2, ..., id6)
GROUP BY object1_id
HAVING COUNT(*) = 6
请注意,6
是提供的ID数量。如果提供了不同数量的ID,则应更改此值。你必须衡量你爸爸的实际表现,看看这是否能提高速度。
如果你不能假设唯一性,那么这应该有效:
SELECT object1_id
FROM composition
WHERE object2_id IN (id1, id2, ..., id6)
GROUP BY object1_id
HAVING COUNT(DISTINCT object2_id) = 6
最重要的是确保您的桌面上有适当的索引! 远比编写一个查询或另一个查询更重要。
答案 1 :(得分:1)
我相信这应该有效。它会发现所有组合1也具有匹配的组合2。除非我误解你在寻找什么。如果是这样,你能提供一些样本数据吗?
SELECT c1.object_id
FROM Composition AS c1
WHERE EXISTS
(
SELECT 1
FROM Composition c2
WHERE c2.object2_id = c1.object1_id
--Add an AND to only look for a certain set of c2's
--AND c2.object2_id IN (SET of object2id's)
)
答案 2 :(得分:0)
我认为这是一个relational division问题。
打个比方:找到供应所有零件的供应商。
object2_id
是part_id
object1_id
是supplier_id
查询是,
查找提供
supplier_id
值part_id
集合中所有部分的供应商的{ 1, 2, 3 }
值。
这通常是合格的,
......供应至少一部分的供应商......
否则所有供应商都会提供空的零件。