0

我有一个具有多对多关系的简单 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 个 object2,我会做 NINTERSECT

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设置 } => { 预期object1_id}
  • { 1, 2 } => { 10 }
  • { 1, 3 } => { 10, 11 }
  • { 1, 2, 3 } => { 10 }
4

3 回答 3

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

最重要的是确保您的表上有适当的索引!这比您编写一个查询还是另一个查询重要得多

于 2012-03-19T18:20:15.457 回答
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)
    )
于 2012-03-19T18:23:03.270 回答
0

我认为这是一个关系划分问题。

类比:找到提供所有零件的供应商。

object2_idpart_id

object1_idsupplier_id

查询是,

查找supplier_id提供值集中所有零件的供应商的part_id{ 1, 2, 3 }

这通常有资格,

...供应商至少提供一种零件并且...

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

于 2012-03-20T10:05:26.043 回答