2

编辑:更简单的例子。(原标题:Oracle 列注入)

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

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

规则:

  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' |  
4

1 回答 1

2
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 列表周围加上括号——即使你修复了它,它也不会产生你显示的输出。

于 2009-10-01T18:41:44.067 回答