横向关键字表示两个或多个表之间的横向连接。它将外部查询的输出与底层横向子查询的输出连接起来。这就像 SQL 中的 for-each 循环,其中子查询遍历相关表的每一行,评估每一行的子查询。
然后将内部子查询返回的输出行添加到与外部查询的连接结果中。如果没有横向,每个子查询将相互独立进行评估,并且无法引用外部查询中引用的表中的项目。
横向的语法:
横向连接由位于内部子查询之前的关键字 Lateral 表示,如下所示:
SELECT
FROM
LATERAL
例子:
让我们假设我们必须找到分数最高的班级的前 3 名学生。查询将是一个简单的查询,如下所示:
SELECT studId, marks
FROM student
ORDER BY marks DESC FETCH FIRST 3 ROWS ONLY
现在假设每个班级都有“n”个部分,我们需要找到分数最高的前 3 名学生。现在我们需要加入部分表以获取结果并使用 Rank()函数找到前 3 名学生。查询将是这样的:
SELECT secId, studId, marks
FROM ( SELECT sec.secId, stud.studId, stud.marks,
RANK() OVER (PARTITION BY sec.secId ORDER BY marks DESC) rn
FROM student stud, section sec WHERE sec.secId = stud.secId )
WHERE rn <= 3
这是横向来拯救的地方。我们将使用我们的第一个查询,获取最高分的前 3 名学生作为内部子查询。接下来,我们使用 Lateral 关键字将 Section 表与内部子查询连接起来。将针对左表中的每一行评估位于 Lateral 右侧的内部查询。下面是查询的样子:
SELECT sec.secId, stud.studId, stud.marks
FROM section sec,
LATERAL (SELECT studId, marks FROM student stud
WHERE sec.secId = stud.secId
ORDER BY marks DESC FETCH FIRST 3 ROWS ONLY)
为什么使用横向?
简单来说,Lateral 提供了一种更简单、更清晰的方法来返回多个列作为输出。尽管由于内部子查询必须对主查询的每一行都运行,但它使查询有点慢。横向关键字的一些重要应用是聚合两个或多个表以及在活动日志中,其中日志记录可能需要大量临时数据。