Вызов Oracle Dynamic Join (Динамическое объединение)
Вопрос
Редактировать: Гораздо более простой пример.(Ранее называвшийся:Внедрение столбца Oracle)
ЦЕЛЬ: Выполните приведенный ниже запрос, чтобы получить следующие результаты?
ЦЕЛЬ: Создайте столбец, зависящий от существующего столбца в таблице, не помещая таблицу в подзапрос.
Правила:
- Реструктурируйте запрос, чтобы поместить
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
Что ж, я зашел так далеко (ниже), но я не могу добавить второе ЛЕВОЕ СОЕДИНЕНИЕ.
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' |
Решение
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 - и даже после того, как вы исправите это, он не выдает вывод, который вы показываете.
Не связан с StackOverflow