相关子查询 - Codeacademy

问题描述:

通过codeacademy学习SQL。这个例子是一张航班表;
例如,假设flight_id增量每增加一个航班,我们可以使用下面的查询来查看由航空公司航班号航班,以及序列号:相关子查询 - Codeacademy

SELECT carrier, id, 
    (SELECT COUNT(*) 
    FROM flights f 
    WHERE f.id < flights.id 
     AND f.carrier = flights.carrier) + 1 AS flight_sequence_number 
FROM flights; 

我不理解的“F”的功能航班之后。另外f.carrier = flights.carrier是什么意思? 如果有人可以摆脱一些很棒的光芒!

+0

这不是函数。它是这个表名的别名 –

+0

为航班提供不同的表别名使事情变得更清晰。 (例如f1和f2) – jarlh

+0

使用窗口函数可以更高效地完成此操作。 –

给你的表别名,因为随着查询的增长你会失去踪迹。

SELECT f.carrier, f.id, (SELECT COUNT(*) 
         FROM flights fs 
         WHERE fs.id < f.id 
         AND fs.carrier = f.carrier) + 1 AS flight_sequence_number 
FROM flights f; 

f是表别名,用于区分在所述内和外查询flights的参考文献。我通常会使用f外部查询和f2为内部查询:

SELECT f.carrier, f.id, 
     (SELECT COUNT(*) + 1 
     FROM flights f2 
     WHERE f2.id < f.id AND f2.carrier = f.carrier 
     ) AS flight_sequence_number 
FROM flights f; 

作为一个说明,这是这样计算的荒谬和老式的方法。 ANSI SQL支持一个简单的函数来执行此操作:

SELECT f.carrier, f.id, 
     ROW_NUMBER() OVER (PARTITION BY f.carrier ORDER BY f.id) as flight_sequence_number 
FROM flights f;