Как использовать Боковое соединение в Oracle? - PullRequest
0 голосов
/ 21 января 2020

Я пытаюсь использовать Боковое соединение в Oracle (Oracle База данных 11g, выпуск 11.2.0.1.0 ), но это дает некоторые ошибка. Я перешел по этой ссылке

https://oracle-base.com/articles/12c/lateral-inline-views-cross-apply-and-outer-apply-joins-12cr1#lateral -inline-views и применил ее к тем же данным, но все еще не работает. Может кто-нибудь выяснить проблему?

SELECT department_name, employee_name
FROM   departments d,
     LATERAL(SELECT employee_name FROM employees e WHERE e.department_id = d.department_id) 
ORDER BY 1, 2; 

Добавление дополнительной информации, чтобы уточнить, почему мне нужно боковое соединение: у меня есть таблица, например,

ID  Length  
1   20
2   50
3   30
4   40
5   20
6   80

, и я хочу добавить еще один столбец сумма длины записей с идентификатором меньше идентификатора текущей строки, т.е.

ID  Length   Sum 
1   20       NULL
2   50       20
3   30       70
4   40       100
5   20       140
6   80       160

При использовании Lateral JOIN это может быть очень просто, например,

select A.ID,A.length,Sum from Table A,
Lateral (select sum(B.length) as Sum from Table B where B.id<A.id);

. любая альтернатива этому?

Ответы [ 2 ]

1 голос
/ 21 января 2020

LATERAL не работает, потому что он введен с версии 12. Как говорят GMB. Это один из подходов к вашей проблеме:

SELECT t1.id, t3.name
FROM   test t1
left join (select id, name from test t2) t3
on t1.id = t3.id
order by 2, 1

Вот DEMO

Или, может быть, вы хотели что-то вроде этого:

select
   t1.id,
   t1.name
from   test t1
       where t1.name in (select t2.name
                from   test t2
                where  t2.id = t1.id)
order by 1, 2;

Если ни один из вышеперечисленных подходов вам не поможет (это не то, что вы хотели), то есть другой путь. Вы можете «включить» LATERAl в вашей старой Oracle 11 версии следующим образом:

alter session set events '22829 trace name context forever';

Видите ли, эта опция / функция существовала в более старых версиях, но не была «включена». Здесь приведен пример DEMO , показывающий, что ваш оператор в данных примера сначала показывает ошибку, а затем после этой команды alter session работает.

Если вы хотите запрос, который даст вам resul, как в вашем вопросе и будет работать на 11g, то вы можете использовать это:

select ID, Length, LAG(ACUM) OVER (order by ID) sum
from (SELECT ID
             , length
             , Sum(length) OVER (ORDER BY id) as ACUM
      FROM   Table1 
      group by ID, length)

И то же самое можно сделать «более простым» способом:

SELECT id,
       length,
       (SELECT Sum(length)
        FROM   Table1 b
        WHERE  a.id > b.id) ACUM
FROM   Table1 a 

Вот демонстрационная версия , в которой этот запрос возвращает те же результаты.

Надеюсь, это поможет.

1 голос
/ 21 января 2020

Ваш запрос в порядке, однако синтаксис LATERAL JOIN был добавлен в Oracle 12.1, поэтому он недоступен для версии 11.2, с которой вы работаете.

В вашем случае вы можете использовать регулярное соединение:

SELECT d.department_name, e.employee_name
FROM department d
INNER JOIN employee e ON e.department_id = d.department_id
ORDER BY 1, 2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...