编辑:更简单的例子。 (原名为:Oracle Column Injection)
目标:完成下面的查询会产生以下结果吗?
目的:创建一个依赖于表中现有列的列,而不将该表放在子查询中。
规则:
tbl
放入子查询中不是一种选择。a,b->1; x->2; y->3
,而不是简单地加入1,1,2,1,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' |
答案 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列表的括号 - 甚至一旦你修复它就不会产生你显示的输出。