編集:はるかに単純な例。(旧称: 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
さて、ここまで (以下) できましたが、2 つ目の 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' |