2014-02-12 35 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

正如最初发布的那样,它看起来是这样,所以我编辑了我的问题来澄清。我打算从其他表格中选择数据,而不仅仅是将它们用于过滤。 –

相关问题