Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql Oracle:是否可以根据列值选择要联接的表?_Sql_Oracle - Fatal编程技术网

Sql Oracle:是否可以根据列值选择要联接的表?

Sql Oracle:是否可以根据列值选择要联接的表?,sql,oracle,Sql,Oracle,首先,这不是我的设计,我没有改变它的选择。我有三个表,它们定义了操作项与事件和审计之间的关系。表格以非常简化的形式设置如下: ACTION_ITEMS ------- ID SOURCE_ID SOURCE_TYPE 1 12345 INC 2 67890 AUD INCIDENTS ------- ID 12345 AUDITS ------- ID 67890 SOURCE_TYPE列指示其他两个表中与该行相关的表。通过为事件和审

首先,这不是我的设计,我没有改变它的选择。我有三个表,它们定义了操作项与事件和审计之间的关系。表格以非常简化的形式设置如下:

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;
**编辑以澄清我正在寻求从所有表中检索数据。

否,但您可以联接两个表并使用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)

请注意,根据
源类型
,您可以访问任一表中的列-如果右侧表中没有匹配项,则这些值将为
NULL
,因为您没有从这些表中进行选择,因此您似乎正在使用这些表进行筛选

另一种编写方法是使用
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);

隐马尔可夫模型。。。或者可能是两个
内部联接子查询的
联合
?@Filburt,OP在问题的第二段中提到了。嗯,对,我错过了,因为我直接跳到了你的答案。仍然在想他对
联盟有什么不喜欢的地方
…我的猜测是,除了一个词之外,这两个部分中的所有内容都完全相同。差不多就是这样。我在寻找比两个几乎相同的子查询更简洁的东西,两个几乎相同的连接加上一个并集。这看起来像是很多重复的工作。正如最初发布的,看起来是这样的,所以我编辑了我的问题来澄清。我确实打算从其他表中选择数据,而不仅仅是将它们用于筛选。