SQL 中的横向关键字
横向关键字表示两个或多个表之间的横向连接。它将外部查询的输出与底层横向子查询的输出连接起来。这就像是 SQL 中的 for-each 循环,子查询遍历相关表的每一行,计算每一行的子查询。
然后,内部子查询返回的输出行被添加到与外部查询的连接结果中。如果没有横向,每个子查询的计算将相互独立,并且不能引用外部查询中引用的表中的项。
横向连接的语法: 横向连接由内部子查询前面的关键字横向表示,如下所示:
SELECT <Column Name>
FROM <Reference Table Name>
LATERAL <Inner Subquery>
例: 假设我们要找到一个班成绩最高的前 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 名学生。接下来,我们使用横向关键字将截面表与内部子查询连接起来。将对左侧表中的每一行计算横向右侧的内部查询。查询如下所示:
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 提供了一种更简单、更干净的方法来返回多个列作为输出。虽然因为内部子查询必须为主查询的每一行运行,所以它使查询有点慢。横向关键字的一些重要应用是两个或多个表的聚合以及活动日志,其中日志记录可能需要大量临时数据。
版权属于:月萌API www.moonapi.com,转载请注明出处