2009-10-01 5 views
1

EDIT: Более простой пример. (Раньше название: Oracle Column Injection)
Oracle Dynamic Join Challenge

ЦЕЛЬ: Заполните полученный запрос, чтобы произвести следующие результаты?

ЦЕЛЬ: Создайте столбец в зависимости от существующего столбца таблицы, не помещая таблицу в подзапрос.

Правила:

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

ответ

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 (для того, чтобы иметь 2 строки для Вала = «Ъ» появляется в результате).

Ваш пример «Я получил этот далеко» даже не запускался так, как написано, ему нужны скобки вокруг списка IN, и даже после того, как вы исправите его, вы не увидите вывод, который вы показываете.

+0

Упс ... исправлено основное сообщение. – Steven

+0

Ты почти там. Я бы предпочел решение, в котором я могу поместить членов одного и того же 'cat' в список, потому что в моем фактическом примере список' val' в 'cat' составляет около 30. – Steven

+2

Почему бы вам не создать фактическая таблица, которая отображает значения в категории и присоединяется к этому? –