Oracle动态加入挑战

时间:2009-10-01 16:16:55

标签: sql oracle plsql oracle9i

编辑:更简单的例子。 (原名为:Oracle Column Injection)

目标:完成下面的查询会产生以下结果吗?

目的:创建一个依赖于表中现有列的列,而不将该表放在子查询中。

规则:

  1. 重构查询以将tbl放入子查询中不是一种选择。
  2. 查询必须使用a,b->1; x->2; y->3,而不是简单地加入1,1,2,1,3
  3. 不得修改子查询tbl
  4. 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 个答案:

答案 0 :(得分: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(为了在结果中出现val ='b'的2行)。

你的“我到目前为止”的例子甚至没有按照书面形式运行 - 它需要围绕IN列表的括号 - 甚至一旦你修复它就不会产生你显示的输出。