2

我有 3 个表,其中一个代表“超类型”,带有一个 ID 列。另外两个表都是子类型,一个 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

也许这就是您正在寻找的...您可能需要进行一些更改才能使其在 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
于 2009-11-17T20:52:31.843 回答
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 回答
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 回答