あなたはリテラルはどのテーブルに基づいて、SQL結果セットが行を作成するために参加した結果にどのように置けばいいの?
質問
Iは、IDカラムを、3つのテーブル、「スーパータイプ」を表すものを有します。二つの他のテーブルは、スーパータイプテーブルへの外部キーであるID列、プラスサブタイプ特異的カラムと、各サブタイプである。
私は、すべてのデータだけでなく、私は行がどこから来たものを表私に語っ弁別として使用できる列を返すクエリをしたい。
ですから、例えば、どのように私はこれを変更することができます:
SELECT * from SUPER S
left outer join SUB_1 S1 on S.ID = S1.ID
left outer join SUB_2 S2 on S.ID = S2.ID
私にこれを返します:
ID SUB_COL_1 SUB_COL_2
==== ========= =========
0001 value x NULL
0002 value y NULL
0003 NULL value z
このように、いくつかのハードコーディングされたリテラル値で識別カラムを追加します何かにます:
ID DISCRIMINATOR SUB_COL_1 SUB_COL_2
==== ============= ========= =========
0001 SUBTYPE_1 value x NULL
0002 SUBTYPE_1 value y NULL
0003 SUBTYPE_2 NULL value z
私はどのような方法でデータモデルを変更することは許されないのです。私はまた、プログラム的事実の後にNULLをテストすることにより、任意の後処理を行うことはできません。 Iは、そのままテーブルで動作し、上に示した正確な結果セットを生成する必要があります。それが答えにすべての違いを、私は、Oracle 11gのを使用しています。
解決
あなたは追加することができます:
CASE IF S1.ID IS NULL THEN 'SUBTYPE_1' ELSE 'SUBTYPE_2' END AS DISCRIMINATOR,
あなたのSELECT
句の開始時ます。
他のヒント
多分これはあなたが探しているものです...あなたはそれがOracleで動作させるためにいくつかの変更を加える必要があります。
SELECT case coalesce(SUB_COL_1,'') when '' then 'SUBTYPE_2' else 'SUBTYPE_1' end, * from SUPER S
left outer join SUB_1 S1 on S.ID = S1.ID
left outer join SUB_2 S2 on S.ID = S2.ID
私は通常、UNIONクエリでこれを行う
Select S.ID, SUBTYPE_1 as DISCRIMINATOR, S1field1 as SUB_COL_1, null as SUB_COL_2
from SUPER S
join SUB_1 S1 on S.ID = S1.ID
union all
Select S.ID, SUBTYPE_2 as DISCRIMINATOR, null as SUB_COL_1, S2.field1 as SUB_COL_2
from SUPER S
join SUB_2 S2 on S.ID = S2.ID
私はおそらくそれに参加する前に、サブクエリ内の各テーブルのデータに識別子を追加したい。
SELECT * from
(select *, 'SUPER' as DISCRIMINATOR from SUPER ) S
left outer join
(select *, 'SUBTYPE1' as DISCRIMINATOR from SUB_1 ) S1
on S.ID = S1.ID
left outer join
(select *, 'SUBTYPE1' as DISCRIMINATOR from SUB_2 ) S2
on S.ID = S2.ID
所属していません StackOverflow