簡體   English   中英

Oracle:是否可以根據列值選擇要聯接的表?

[英]Oracle: Is it possible to choose which table to join based on a column value?

首先,這不是我的設計,我沒有選擇更改它的選擇。 我有三個表定義了行動項與事件和審計之間的關系。 這些表以非常簡化的形式設置,如下所示:

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)

請注意,您可以根據SOURCE_TYPE訪問任一表中的列 - 如果右側表中沒有匹配項,則這些值將為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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM