Oracle

使用 CASE 進行連接的查詢索引

  • August 19, 2016

我正在嘗試優化 Oracle 10g 上的查詢(我知道!),並且我有一個 4 列的表,其中包含類似於此結構的 varchar2 值:

CREATE TABLE Settings (
   Client VARCAR2(50)
   , Class VARCHAR2(50)
   , Setting VARCHAR2(50)
   , Setting_Value VARCHAR(20)
)

該查詢旨在為 Client 和 Class 使用靜態值,這些已被硬編碼,而 Setting 在兩個部分中有所不同,並且 Setting_Value 應連接到另一個表中的不同列,具體取決於 Setting 的值。

我一直在使用這種結構設置連接:

編輯:似乎有混亂。Setting 列有效地指向other_table. 因此,設置記錄充當給定客戶端/類操作的過濾器。因此,向 中添加設置other_table會適得其反。

WHERE Settings.SettingValue =
   CASE Settings.Setting
       WHEN 'Column1' THEN other_table.Column1
       WHEN 'Column2' THEN other_table.Column2
       WHEN 'Column3' THEN other_table.Column3
       ...

問題是我無法讓 Oracle 10g 為 CASE 語句中的值命中 other_table 上的任何索引。是否有我遺漏的策略或適用於 Oracle 10g 使用索引而不是全表掃描的結構?

您可能應該嘗試OR類似:

select * 
 from myTable join otherTable
on (setting = 'A' and value = column1) or 
  (setting = 'B' and value = column2)

UNION ALL可能對你有用

select * from myTable join otherTable on setting = 'A' and value = column1
union all
select * from myTable join otherTable on setting = 'B' and value = column2

引用自:https://dba.stackexchange.com/questions/147089