如何在合成表上进行交集

时间:2012-03-19 18:15:57

标签: sql oracle join intersect relational-division

我有一个简单的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}
  • {1,2} =&gt; {10}
  • {1,3} =&gt; {10,11}
  • {1,2,3} =&gt; {10}

3 个答案:

答案 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_idpart_id

object1_idsupplier_id

查询是,

  

查找提供supplier_idpart_id集合中所有部分的供应商的{ 1, 2, 3 }值。

这通常是合格的,

  

......供应至少一部分的供应商......

否则所有供应商都会提供空的零件。