テーブル A とテーブル B があるとします。技術的には、これは多対多の関係です。A の 1 つのエントリを B の複数のエントリに関連付けることができ、その逆も可能です。私の問題は、一連の B エントリを返すサブクエリがあるときに発生します。これらは A に一致しますが、サブクエリのスーパーセットである可能性が高い A に関連付けられている B のすべてのエントリも取得したいと考えています。その結果、A を B に結合する必要があります。A と B の両方からの情報を返す必要があることに注意してください。
私がやりたいことは、A から始めて B に参加し、B のエントリがサブクエリで一致した場合、A のエントリに関連付けられた B のすべてのエントリが返されます。
たとえば、エントリ A1 が B1、B2、および B3 に関連付けられているとします。サブクエリに B1 が含まれ、B から A に結合すると、A1 と B1 を含む 1 つの行が得られます。B に再び結合すると、B1、B2、および B3 が 3 行に並んだ A1 を取得できます。私がやりたいのは、A を B に結合できる関数、式などを見つけて、B1 がサブクエリにあり、B1 が A1 に関連付けられていることを確認することです。したがって、A1 のすべての行が返され、B1 が取得されます。 B2、B3 の 3 つの行。A2 が B4 と B5 に関連付けられていて、どちらもサブクエリに含まれていない場合は、A2 を結果から除外する必要があります。基本的に、関連付けの 1 つのヒットで関連付けのすべての行が返されます。このようにして、A から B への 1 対多の関係として扱うことができます。
それを図示するには:
A | B
----------
A1 | B1
A1 | B2
A1 | B3
A2 | B4
A2 | B5
ここで、A1 と B1、B2、および B3 は両方ともキーであり (実際にはランダムに生成された bigint の 2 つの列ですが、これは少し単純化されています)、他のテーブルに外部キーとして存在します。最初の例では:
WITH SUB (ID) AS (Subquery)
SELECT bb.*, aa.*
FROM SUB
JOIN B bb
ON bb.OTHER_ID = SUB.ID
JOIN A aa
ON bb.ID = aa.ID
サブクエリが B1 を返すと、次のようになります。
A | B
----------
A1 | B1
ここで、これをクエリに追加し、SELECT を aa に変更するとします。、bb2。:
JOIN B bb2
ON aa.ID = bb2.ID
次に、最初のテーブル例に見られるように、A1 のすべての行を取得します。ただし、これには B に戻る必要があり、これは避けたいと思います。サブクエリは B.ID を返さず、別の識別子 B.OTHER_ID を返すことにも注意してください。代わりに、次のことを考慮してください。
SELECT aa.*, bb.*
FROM A aa
JOIN B bb
ON aa.ID = bb.ID
WHERE
--Insert function here that will take the subquery, and if any row in B
--is present in the set returned by the subquery, then ALL rows in A that include
--at least one matching row will be returned with all related rows in B
これは私が実際にやろうとしていることを単純化したものですが、その理由は、B を A に結合し、次に A を B に結合するのはコストがかかりすぎるからです (正規化のために間にいくつかのテーブルがあります)。AをBに結合するだけでこれを行う方法はありますか、それとも存在しないものを望んでいますか? 読みやすさを向上させるためにクエリを書き直すつもりはありません。関係を論理的に処理して、必要な結合の数を減らす方法を探しています。
何度も質問して申し訳ありませんが、私がやろうとしていることを適切に伝えることができていないと思います. 多分それは不可能です。