2

ID列を持つ「スーパータイプ」を表す3つのテーブルがあります。他の 2 つのテーブルはそれぞれサブタイプであり、スーパータイプ テーブルへの外部キーである 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

いかなる方法でもデータ モデルを変更することは許可されていません。また、事後にプログラムで NULLS をテストして、後処理を行うこともできません。テーブルをそのまま使用して、上記の正確な結果セットを生成する必要があります。答えに違いがある場合、私はOracle 11gを使用しています。

4

4 に答える 4

4

あなたは付け加えられます:

CASE IF S1.ID IS NULL THEN 'SUBTYPE_1' ELSE 'SUBTYPE_2' END AS DISCRIMINATOR, 

あなたのSELECT句の始めに。

于 2009-11-17T20:53:59.440 に答える
1

たぶん、これはあなたが探しているものです...オラクルで動作させるには、いくつかの変更を加える必要があるかもしれません.

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
于 2009-11-17T20:52:31.843 に答える
1

おそらく、サブクエリに参加する前に、各テーブルのデータに識別子を追加します。

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
于 2009-11-17T21:09:25.803 に答える
1

私は通常これを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
于 2009-11-17T20:55:21.797 に答える