如何在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
或者您可能想要这样的东西:
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 相同的结果。
希望这对您有所帮助。
我正在尝试使用 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
或者您可能想要这样的东西:
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 相同的结果。
希望这对您有所帮助。