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がある場合は、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設定}=>{期待される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

これでうまくいくと思います。一致するコンポジション2を持つすべてのコンポジション1が検索されます。私があなたが探しているものを誤解していない限り。もしそうなら、いくつかのサンプルデータを提供できますか?

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 }

これは通常、次のように修飾されます。

...少なくとも1つの部品を供給するサプライヤーと...

そうしないと、すべてのサプライヤが空の部品セットを提供します。

于 2012-03-20T10:05:26.043 に答える