2

編集:はるかに単純な例。(旧称: Oracle Column Injection)

目標:以下のクエリを完了すると、次の結果が生成されますか?

目的:テーブルをサブクエリに入れることなく、テーブル内の既存の列に依存する列を作成します。

ルール:

  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

さて、ここまで (以下) できましたが、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' |  
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の代わりにUNION ALLを使用するつもりだと思います(結果にval ='b'の2行を表示するため)。

「Igotthisfar」の例は、記述どおりに実行されません。INリストを括弧で囲む必要があります。修正しても、表示される出力が生成されません。

于 2009-10-01T18:41:44.067 に答える