2009-10-01 24 views
1

編輯:更簡單的例子。 (原標題爲:Oracle Column Injection)
Oracle Dynamic Join Challenge

目標:完成以下查詢生成以下結果?

用途:根據表中現有的列創建列,而不將表放入子查詢中。

規則:

  1. 重構該查詢把tbl在一個子查詢是不是一種選擇。
  2. 查詢必須使用a,b->1; x->2; y->3,而不是簡單地加入1,1,2,1,3
  3. 子查詢tbl不得修改。

 

SELECT val, cat 
    FROM (SELECT 'a' val FROM DUAL UNION ALL 
     SELECT 'b' val FROM DUAL UNION ALL 
     SELECT 'x' val FROM DUAL UNION ALL 
     SELECT 'b' val FROM DUAL UNION ALL 
     SELECT 'y' val FROM DUAL) tbl 
    ... JOIN (...) ON ... 

val | cat 
-----+----- 
'a' | 1 
'b' | 1 
'x' | 2 
'b' | 1 
'y' | 3 

好吧,我得到了這個遠(下同),但我不能添加第二個LEFT JOIN。

SELECT val, cat 
    FROM (SELECT 'a' val FROM DUAL UNION ALL 
     SELECT 'b' val FROM DUAL UNION ALL 
     SELECT 'x' val FROM DUAL UNION ALL 
     SELECT 'b' val FROM DUAL UNION ALL 
     SELECT 'y' val FROM DUAL) tbl 
    LEFT JOIN (SELECT 1 cat FROM DUAL) ON val in ('a','b') 

val | cat 
-----+----- 
'a' | 1 
'b' | 1 
'x' | 
'b' | 1 
'y' | 

回答

1
SELECT tbl.val, map.cat 
    FROM (SELECT 'a' val FROM DUAL UNION 
     SELECT 'b' val FROM DUAL UNION 
     SELECT 'x' val FROM DUAL UNION 
     SELECT 'b' val FROM DUAL UNION 
     SELECT 'y' val FROM DUAL) tbl 
    LEFT JOIN (SELECT 'a' val, 1 cat FROM DUAL UNION 
       SELECT 'b' val, 1 cat FROM DUAL UNION 
       SELECT 'x' val, 2 cat FROM DUAL UNION 
       SELECT 'y' val, 3 cat FROM DUAL) map ON map.val = tbl.val 

從你的例子,我懷疑你的意思是使用UNION ALL而不是UNION(以具有2行的VAL =「B」出現在結果中)。

您的「我得到了這麼多」的例子甚至沒有像寫入那樣運行 - 它需要圍繞IN列表中的圓括號 - 並且即使您修復了它,也不會產生您顯示的輸出。

+0

糟糕...更正的主要帖子。 – Steven 2009-10-01 18:48:13

+0

你快到了。我更喜歡一個解決方案,我可以將同一個'cat'的成員放入列表中,因爲在我的實際示例中,'cat'中'val'的列表大約爲30. – Steven 2009-10-01 18:48:43

+2

爲什麼不創建一個將這些值映射到類別的實際表格,並加入到該類別中? – 2009-10-01 19:09:13