如何在Oracle中使用Lateral Join?

How to use Lateral join in Oracle?

我正在尝试使用 Lateral Join in Oracle(Oracle Database 11g Release 11.2.0.1.0) 但它给出了一些错误。我已经关注了这个 link

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; 

添加更多详细信息以阐明我需要横向连接的原因: 我有一个 table 例如

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

并且我想添加另一列 ID 小于当前行 ID 的记录长度总和,即

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);

那么有什么替代方案吗?

你的查询很好,但是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

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

Here is a 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;

如果上述方法none对您没有帮助(这不是您想要的),那么还有另一种方法。您可以在您的旧 Oracle 11 版本中 "enable" LATERAl,如下所示:

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

你看,这个option/feature确实存在于旧版本中,但它不是"enabled"。 Here is a DEMO 显示您对示例数据的声明首先显示错误,然后在这个 alter session 命令之后,它起作用了。

如果您想要一个能为您提供问题中的结果并且适用于 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)

同样的事情可以用 "more easy" 的方式完成:

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

Here is the demo 你可以在哪里看到这个查询 returns 相同的结果。

希望这对您有所帮助。