2009-11-17 82 views
2

我有3個表格,一個表示「超類型」,帶有一個ID列。另外兩個表是每個子類型,ID列是超類型表的外鍵,另外還有一個子類型專用列。如何根據連接哪個表來創建一個sql結果集來創建行的文字結果?

我想要一個返回所有數據的查詢,以及一列可以用作判別器的列,告訴我該行來自哪個表。

因此,例如,我怎麼能修改此:

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

您可以添加:

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

SELECT條款的開始。

+0

工程就像一個魅力。謝謝! – 2009-11-17 21:37:02

+0

@凱文,總是樂於幫忙! – 2009-11-17 21:37:37

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 
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 
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 
+0

我試圖儘可能地避免子查詢的性能問題。 – 2009-11-17 21:31:52

+1

這些更準確的是內嵌視圖而不是子查詢,我不希望看到任何性能問題。 – 2009-12-08 17:22:55

相關問題