私は、SQL クエリを使用して少し作業不能な状況に陥っていることに気づきました。何かが足りないか、何か新しいことを学べることを願っています。私が扱っているDB2データベースの構造は、この種のクエリ用に正確に構築されているわけではありませんが、私はこれを任されています...
Table People と Table Groups があるとします。グループには複数のユーザーを含めることができ、1 人のユーザーが複数のグループに所属することができます。うん、もうぐちゃぐちゃ。いずれにせよ、2 つをリンクするいくつかの中間テーブルがあります。問題は、グループのリストから始めて、それらのグループ内のすべての人を取得し、次にその人が所属しているすべてのグループ (最初のグループ セットのスーパーセット) を取得する必要があることです。これは、グループから始めて人々に参加し、戻って再びグループに参加することを意味します。結果セット内の両方のテーブルからの情報も必要なので、多くの手法が除外されます。
追加情報を得るために、これを他の多くのテーブルと結合する必要があり、クエリは膨大で扱いにくく、遅くなります。People から始めて、それを Groups に参加させてから、指定された一連のグループ (サブクエリを介して行われる) に 1 つのグループがある場合、すべてのグループを指定する方法があるかどうか疑問に思っています。その人は返さなければならないからです。これを実現する方法はわかりませんが、SQL でこれを実現する比較的クリーンな方法があると考えています (期待しています)。
簡単で汚い例:
SELECT ...
FROM GROUPS g
JOIN LINKING_A a
ON g.GROUPID = a.GROUPID
AND GROUPID IN (subquery)
JOIN LINKING_B b
ON a.GROUPLIST = b.GROUPLIST
JOIN PEOPLE p
ON b.PERSONID = p.PERSONID
--This gets me all people affiliated with groups,
-- but now I need all groups affiliated with those people...
JOIN LINKING_B b2
ON p.PERSONID = b2.PERSONID
JOIN LINKING_A a2
ON b2.GROUPLIST = a.GROUPLIST
JOIN GROUPS g2
ON a2.GROUPID = g.GROUPID
そして、結果セットで p と g2 から情報を返すことができます。困っているところがわかります。このクエリで実行される他の多くの結合は言うまでもなく、いくつかの大きなテーブルで多くの結合が行われます。PEOPLE を GROUPS に結合してクエリを実行できるようにする必要があります。次に、サブクエリに関連付けられたグループがある人がいる場合、PEOPLE のそのエントリに関連するすべてのグループを返す必要があることを指定します。私は GROUP BY がちょうどいいかもしれないと思っていますが、実際に知るのに十分なほど使用していません。したがって、ビルがグループ A、B、および C の一部であり、サブクエリがグループ A を含むセットを返す場合、結果セットにはグループ A、B、および C とともにビルが含まれるはずです。