编辑: 更简单的例子。(原标题为: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' |  
有帮助吗?

解决方案

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 列表周围的括号 - 即使您修复它也不会产生您显示的输出。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top