Oracle Dynamic Join Challenge - PullRequest
       4

Oracle Dynamic Join Challenge

1 голос
/ 01 октября 2009

РЕДАКТИРОВАТЬ: Пример гораздо проще. (Ранее называлось: «Внедрение в колонку 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

Хорошо, я зашел так далеко (ниже), но я не могу добавить второе левое соединение.

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 Ответ

1 голос
/ 01 октября 2009
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 строки для val = 'b').

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

...