SQL質疑応答スレ 9問目

このエントリーをはてなブックマークに追加
330NAME IS NULL
■DBMS
PostgresSQL 8.3以上

■テーブル定義
・IDテーブル
id_1 integer,
id_2 integer,
id_3 integer

・マスターテーブル
id integer,
class char(1)

■テーブルデータ
・IDテーブル
1, 2, 3
1, 2, 4
5, -1, -1
-1, 1, 2
2, -1, 5

・マスターテーブル
1, A
2, A
3, A
4, B
5, B
-1, Z

■やりたいこと
マスターテーブルを参照してIDテーブルの各IDにクラス(A, B, Z)を振り当て、
各レコードが同一クラスに属するか否かを判定し、同一クラスに属するレコード
だけクラス付で抽出する。
ここで「同一クラスに属する」とは、クラスA, B, Zからなるグループに対して、
Z以外の要素が一種類しか存在しない場合に、グループはそのクラスに属すると定める。

【例】
A, A, B, Z -> 属するクラス無し
Z, Z, A, A, Z -> クラスAに属する
B, A -> 属するクラス無し
B -> クラスBに属する

今の場合、

1, 2, 3 -> A, A, A -> A
1, 2, 4 -> A, A, B -> 属するクラス無し
5, -1, -1 -> B, Z, Z -> B
-1, 1, 2 -> Z, A, A -> A
2, -1, 5 -> A, Z, B -> 属するクラス無し

であり、最終的に欲しいデータは

1, 2, 3, A
5, -1, -1, B
-1, 1, 2, A

となります。よろしくお願いします。

※IDテーブルの列数=3、クラス数=3 というのは揃っている必要はなく
IDが5列ありクラスが10種類あるという場合でも適用可能な回答をお願いしたいです。