0

我正在尝试在 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 小于当前行 ID 的记录长度总和的另一列,即

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

例如,使用横向连接可能非常简单

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

那么有没有其他选择呢?

4

2 回答 2

1

您的查询很好,但是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
于 2020-01-21T12:54:10.153 回答
1

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

这是一个演示

或者,也许你想要这样的东西:

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;

如果上述方法都没有帮助您(这不是您想要的),那么还有另一种方法。您可以像这样在旧的 Oracle 11 版本中“启用”LATERAl:

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

你看,这个选项/功能在旧版本中确实存在,但它没有“启用”。 这是一个演示,显示您对示例数据的语句首先出现错误,然后在此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)

同样的事情可以用一种“更简单”的方式来完成:

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

这是演示,您可以在其中看到此查询返回相同的结果。

希望这可以帮助。

于 2020-01-21T13:12:27.800 回答