2014-02-12 41 views
2

首先,這不是我的設計,我沒有改變它的選項。我有三個表格定義了行動項目與事件和審計之間的關係。這些表中,以非常簡單的形式中,設置了這樣的:Oracle:是否可以根據列值選擇要連接的表?

ACTION_ITEMS 
------- 
ID SOURCE_ID SOURCE_TYPE 
1  12345  INC 
2  67890  AUD 

INCIDENTS 
------- 
ID 
12345 

AUDITS 
------- 
ID 
67890 

的SOURCE_TYPE列指示該其他兩個表的是有關該行。通過爲事件和審計操作項目創建單獨的查詢,將這些查詢連接到適當的表,然後執行聯合,可以很容易地獲取所有記錄的詳細信息。

我想知道的是,如果可以根據列的值有條件地加入到表中。換句話說,這樣的事情,但實際工作:

SELECT 
    AI.* 
    ,INC.* 
    ,AUD.* 
FROM ACTION_ITEMS AI 
JOIN 
    CASE AI.SOURCE_TYPE 
    WHEN 'INC' THEN INCIDENTS INC ON (AI.SOURCE_ID = INCIDENTS.ID) 
    WHEN 'AUD' THEN AUDITS AUD ON (AI.SOURCE_ID = AUDITS.ID) 
    END; 

**編輯澄清,我正在尋找來檢索所有表數據。

回答

3

沒有,但你可以加入表和您的加入子句中使用的條件:

SELECT AI.* 
FROM ACTION_ITEMS AI 
LEFT JOIN INCIDENTS ON AI.SOURCE_TYPE = 'INC' AND (AI.SOURCE_ID = INCIDENTS.ID) 
LEFT JOIN AUDITS ON AI.SOURCE_TYPE = 'AUD' AND (AI.SOURCE_ID = INCIDENTS.ID) 

注意,您將能夠取決於SOURCE_TYPE或者從表訪問列 - 如果沒有在右側表中匹配那些值將是NULL

+1

嗯......或者可能是兩個'INNER JOIN'子查詢的'UNION'? – Filburt

+0

@Filburt OP在問題的第二段提到。 –

+0

呃,我錯過了,因爲我直接跳到你的答案。仍然想知道他不喜歡'UNION'... – Filburt

3

您似乎使用表進行篩選,因爲您沒有從中進行選擇。

另一種方式來寫這篇文章是由where子句中使用的條件:

select AI.* 
from ACTION_ITEMS AI 
where (AI.SOURCE_TYPE = 'INC' and 
     exists (select 1 from INCIDENTS where AI.SOURCE_ID = INCIDENTS.ID) 
    ) or 
     (AI.SOURCE_TYPE = 'AUD' and 
     exists (select 1 from AUDITS where AI.SOURCE_ID = AUDITS.ID) 
    ); 

如果你想與join s到做到這一點,你必須使用left outer join,然後明確地過濾火柴:

SELECT AI.* 
FROM ACTION_ITEMS AI LEFT JOIN 
    INCIDENTS 
    ON AI.SOURCE_ID = INCIDENTS.ID LEFT JOIN 
    AUDITS 
    ON AI.SOURCE_TYPE = 'AUD' AND (AI.SOURCE_ID = AUDITS.ID) 
WHERE (AI.SOURCE_TYPE = 'INC' and INCIDENTS.ID is not null) OR 
     (AI.SOURCE_TYPE = 'AUD' and AUDITS.ID is not null); 
+0

正如最初發布的那樣,它看起來是這樣,所以我編輯了我的問題來澄清。我打算從其他表格中選擇數據,而不僅僅是將它們用於過濾。 –

相關問題