0

多対多形式のテーブルが 3 つあります。つまり、テーブル A、B、および AB は期待どおりに設定されています。

A ID のセットが与えられた場合、すべての ID に一致する AB の行のみを選択する必要があります。

次のようなものは機能しません。

"SELECT * FROM AB WHERE A_id = 1 AND A_id = 2 AND A_id = 3 AND ..." 1 つの行に複数の A_id が含まれないため

SQLステートメントでORを使用すると、少なくとも1つのA IDを持つすべての結果が得られるため、あまり良くありません(ただし、すべてのIDを持つ行のみが必要です)。

編集:

申し訳ありませんが、説明する必要があります。実際の多対多の関係が実際の問題に関連しているかどうかはわかりません。表の概要は次のとおりです。

Table People
int id
char name

Table Options
int id
char option

Table peoples_options
int id
int people_id
int option_id

そのため、人のリスト、オプションのリスト、オプションと人の表があります。

したがって、(1、34、44、...) などのオプション ID のリストが与えられた場合、すべてのオプションを持つ人だけを選択する必要があります。

4

3 に答える 3

1

データベースが正しく正規化されていないようです。テーブルには、各行にシングルとABシングルが必要です。その場合、あなたの-version は動作するはずです (ただし、私は自分自身を使用します)。A_idB_idORIN

前の段落は無視してください。あなたの編集から、多対多テーブル内の のBサブセットのすべてを持つすべてのを本当に知りたいと思っていました-クエリについては以下を参照してください。A

実際のスキーマの詳細を教えてください。それがなければ、何が必要かを理解するのは少し難しいです。

私は次のようなものを見ることを期待しています:

table a:
    a_id integer
    a_payload varchar(20)
table b:
    b_id integer
    b_payload varchar(20)
table ab:
    a_id integer
    b_id integer

あなたの説明に基づいて、私が考えることができる唯一のことは、テーブル内Bのすべての のセットを持つすべての のリストが必要だということです。その場合、次のようなものを見ています ( が1、3、および 4 である のリストを取得するため) :AABBA

select distinct b_id from ab n1             
    where exists (select b_id from ab where a_id = 1 and b_id = n1.b_id)     
    and   exists (select b_id from ab where a_id = 3 and b_id = n1.b_id)     
    and   exists (select b_id from ab where a_id = 4 and b_id = n1.b_id);    

これは DB2 で機能しますが、選択したサーバーが実装する SQL の量がわかりません。

于 2008-12-01T02:06:59.063 に答える
0

少しハックな解決策は、IN を group by および having フィルターと共に使用することです。そのようです:

SELECT B_id FROM AB
WHERE A_id IN (1,2,3)
GROUP BY B_id
HAVING COUNT(DISTINCT A_id) = 3;

そうすれば、正確に 3 つの A_id 値を持つ B_id 値のみを取得し、リストから取得する必要があります。(A_id, B_id) が一意でない場合に備えて、COUNT で DISTINCT を使用しました。他の列が必要な場合は、別の選択ステートメントの FROM 句でサブ選択としてこのクエリに結合できます。

于 2008-12-01T02:24:10.310 に答える