あなたはリテラルはどのテーブルに基づいて、SQL結果セットが行を作成するために参加した結果にどのように置けばいいの?

StackOverflow https://stackoverflow.com/questions/1751647

  •  20-09-2019
  •  | 
  •  

質問

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
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top