首先,这不是我的设计,我没有选择更改它。我有三个表定义了行动项与事件和审计之间的关系。这些表格以非常简单的形式设置如下:
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;
**编辑澄清我正在寻求从所有表中检索数据。
答案 0 :(得分:4)
不,但您可以加入两个表并使用join子句中的条件:
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 :(得分: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
执行此操作,则必须使用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);